檢視和儲存過程
一、檢視
1、檢視是虛擬的表。與包含資料的表不一樣,檢視只包含使用時動態檢索資料的查詢。
2、檢視的應用:
1)重用SQL語句。
2)簡化複雜的SQL操作。在編寫查詢後,可以方便地重用它而不必知道它的基本查詢細節。
3)使用表的組成部分而不是整個表。
4)保護資料。可以給使用者授予表的特定部分的訪問許可權而不是整個表的訪問許可權。
5)更改資料格式和表示。檢視可返回與底層表的表示和格式不同的資料。
3、因為檢視不包含資料,所以每次使用檢視時,都必須查詢執行所需的任一個檢索。如果你用多個聯結表和過濾建立了複雜的檢視或者嵌套了檢視,可能會發現效能下降得厲害。因此,在部署使用了大量檢視的應用前,應該進行測試。
4、檢視的規則和限制
1)與表一樣,檢視必須唯一命名。
2)對於可以建立的檢視數目沒有限制。
3)檢視可以巢狀,既可以利用從其他檢視中檢索資料的查詢來構造一個檢視。
4)ORDER BY可以用在檢視中,但如果從該檢視檢索資料的SELECT語句中也含有ORDER BY,那麼該檢視的ORDER BY將被覆蓋。
5)檢視不能索引,也不能有關聯的觸發器或預設值。
6)檢視可以和表一起使用。例如,可以寫一條聯結表和檢視的SELECT語句。
5、使用檢視
1)檢視用CREATE VIEW語句來建立。
2)使用SHOW CREATE VIEW view_name;來檢視建立檢視的語句。
3)使用DROP VIEW view_name;刪除檢視。
4)更新檢視時,可以先用DROP再用CREATE ,也可以直接用CREATE OR REPLACE VIEW。如果要更新的檢視不存在。則會建立一個檢視;如果存在,則會替換原有檢視。
6、例子
這條語句建立了一個檢視,它聯結3張表,返回已訂購了任意產品的所有客戶的列表。
1 CREATE VIEW product_customers AS 2 SELECT cust_name, cust_contact, prod_id 3 FROM customers,orders,orderitems 4 WHEREcustomers.cust_id=orders.cust_id AND orderitems.order_num=orders.order_num;
這條語句檢索了訂購了產品TNT2的客戶。使用的是建立了的檢視。
1 SELECT cust_name,cust_contact FROM product_customers WHERE prod_id='TNT2';
7、一般,應將檢視用於檢索,而不用於更新。
二、儲存過程
儲存過程就是為以後的使用而儲存的一條或多條MySQL語句的集合。使用儲存過程比使用單獨的SQL語句快。
1、建立儲存過程
1 DELIMITER // 2 CREATE PROCEDURE product_info( 3 OUT plow DECIMAL(8,2), 4 OUT phigh DECIMAL(8,2), 5 OUT pavg DECIMAL(8,2) 6 ) 7 BEGIN 8 SELECT MIN(prod_price) INTO plow FROM products; 9 SELECT MAX(prod_price) INTO phigh FROM products; 10 SELECT AVG(prod_price) INTO pavg FROM products; 11 END// 12 DELIMITER ;
此儲存過程名為product_info。一般,儲存過程並不顯示結果,而是把結果返回給你指定的變數。儲存過程的引數在()中列舉出來,每個引數必須具有指定的型別。MySQL支援IN(傳遞給儲存過程)、OUT(從儲存過程傳出)、INOUT(對儲存過程傳入和傳出)型別的引數。儲存過程的程式碼位於BEGIN和END語句內,檢索值儲存到相應的變數中(通過INTO關鍵字)。
儲存過程的引數允許的資料型別與表中使用的資料型別相同。注意,記錄集不是允許的型別。
2、執行儲存過程
MySQL執行儲存過程的語句為CALL。CALL接受儲存過程的名字以及需要傳遞給他的任意引數。儲存過程可以顯示結果,也可以不顯示結果。
變數是記憶體中的一個特定的位置,用來臨時儲存資料。所有MySQL變數名都必須以@開始。為呼叫上面定義的儲存過程,必須指定3個變數名,如下所示:
1 CALL product_info(@plow,@phigh,@pavg);
在呼叫時,這條語句並不顯示任何資料。它返回以後可以顯示的變數。為了顯示,可如下進行:
3、刪除儲存過程
1 DROP PROCEDURE product_info;
如果指定的儲存過程不存在,則會產生一個錯誤。當儲存過程存在時才刪除(不存在也不產生錯誤)可使用DROP PROCEDURE IF EXISTS。