視圖和存儲過程
一、視圖
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 WHERE customers.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。
視圖和存儲過程