1. 程式人生 > >視圖和存儲過程

視圖和存儲過程

select語句 臨時 con 內存 spa select 也不能 返回 exist

一、視圖

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。

視圖和存儲過程