MySql視圖及存儲過程

1、視圖

視圖是虛擬的表,它只包含使用時動態檢索數據的查詢。安全

 

1、使用視圖的好處服務器

一、重用SQL語句;函數

二、簡化複雜的SQL操做(能夠方便的重用它而沒必要知道它的基本查詢細節);性能

三、使用表的組成部分而不是整個表;spa

四、保護數據(能夠給用戶授予表的部分訪問權限而不是整個表的訪問權限);命令行

五、更改數據格式和表示(視圖可返回與底層表的表示和格式不一樣的數據)。code

PS由於視圖不包含數據,因此每次使用視圖,都必須處理執行所需的任何一個檢索;若是使用了多個聯結和過濾建立了複雜的視圖或嵌套視圖,性能會降低比較明顯。blog

 

2、視圖的規則和限制索引

一、視圖必須惟一命名(視圖與別的視圖或表不能有相同的名字);ci

二、建立的視圖數目沒有限制;

三、爲了建立視圖,必須有足夠的訪問權限;

四、視圖能夠嵌套;

五、order by可用於視圖中;但若是該視圖中檢索數據的select語句包含order by,那麼該視圖中的order by將被覆蓋;

六、視圖不能索引,也不能有關聯的觸發器或默認值;

七、視圖能夠和表一塊兒使用。

 

3、使用視圖

create view:建立視圖;

show create view viemname:查看建立視圖的語句;

drop view viewname:刪除視圖;

PS更新視圖時,能夠先用drop再用create,也能夠直接使用create or replace view;若是要更新的視圖不存在,則第二條更新語句會建立一個視圖,若是視圖存在,則第二條更新語句替換原有視圖。

 

1、簡化複雜的聯結

視圖最多見應用之一就是隱藏複雜的SQL,一般會涉及聯結;例如:

create view productcustomers AS
select cust_name,cust_conact,prod_id
from customers,orders,orderitems
where customers.cust_id = order.cust_id
  and orderitems.order_num = order.order_num;

這條語句建立一個名爲productomers的視圖,聯結三個表,以返回已訂購任意產品的全部客戶的列表。若是執行select * from productcustomers,將列出訂購了任意產品的客戶。

爲了檢索出訂購了產品TEST的客戶,可以下進行:

select cust_name,cust_contact
from productcustomers
where prod_id = 'TEST';

這條語句經過where子句從視圖productcustomers中檢索特定的數據。

PS視圖能夠極大的簡化複雜SQL語句的使用,利用視圖,可一次性編寫基礎的SQL(不受特定數據限制的視圖),而後根據須要屢次使用。

 

2、從新格式化檢索出的數據

視圖的另外一個經常使用功能就是從新格式化檢索出的數據,好比:

create view vendorlocations AS
select concat(RTrim(vend_name),'(',RTrim(vend_country),')')
    AS vend_title
from vendors
order by vend_name;

這條SQL語句使用select語句建立視圖,在單個組合計算列中返回供應商名和位置,之後每次須要時使用這個視圖便可。

 

3、使用視圖過濾不想要的數據

視圖對於普通的where子句也頗有用,例如:

create view customeremaillist AS
select cust_id,cust_name,cust_email
from customers
where cust_email is not NULL;

這條SQL語句定義了customeremaillist視圖,它過濾沒有電子郵件地址的客戶。

PS若是從視圖檢索數據時使用一條where子句,則兩組子句(一組在視圖中,另外一組是傳遞給視圖的)將自動組合。

 

4、視圖與計算字段

視圖對於簡化計算字段來講,也頗有用,例如:

create view orderitemsexpanded AS
select order_num,prod_id,quantity,item_price,
quantity*item_price AS expanded_price
from orderitems;

這條語句建立了orderitemsexpanded視圖,它檢索某個特定訂單的物品以及每種物品的總價格,若是須要使用該視圖,只須要執行一條select語句便可,好比:

select * from orderitemsexpanded where order_num = 10086;

 

5、更新視圖

一般來說,視圖是可更新的,更新一個視圖即更新其基表(若是MySQL不能正確的肯定被更新的基數據,則不容許更新,包括插入和刪除);即視圖若是定義以下操做,則不可更新:

一、分組(使用group by和having);二、聯結;三、子查詢;四、並;五、彙集函數(min()、count()、sum()等);六、distinct;七、導出列。

 

2、存儲過程

定義:爲方便之後使用而保存的一條或多條MySQL語句的集合。可將其視爲批文件,雖然其做用不只限於批處理。

 

1、爲何要使用存儲過程(簡單、安全、高性能)

一、經過把處理封裝在容易使用的單元中,簡化複雜的操做;

二、不要求反覆創建一系列處理步驟,保證了數據的完整性;

三、簡化對變更的管理(若是表名、列名或業務邏輯變動,只須要更改存儲過程的代碼),這一點的延伸就是安全性;

四、提升性能(使用存儲過程比使用單獨的SQL語句要快);

 

2、使用存儲過程

1、執行存儲過程

MySQL將存儲過程的執行稱爲調用,執行的語句用call,call接受存儲過程的名字以及傳遞給它的任意參數;例以下面的例子:

call productpricing(@pricelow,@pricehigh,@priceaverage);

這條SQL語句中,執行名爲productpricing的存儲過程,並計算返回產品的最低、最高和平均價格(存儲過程能夠顯示結果,也能夠不顯示)。

 

2、建立存儲過程

下面建立一個返回產品平均價格的存儲過程,例子以下:

create procedure productpricing()
begin
       select avg(prod_price) as priceaverage
       from products;
end;

此存儲過程名爲productpricing,用create procedure productpricing()語句定義;若是存儲過程接受參數,它將在()中列舉出來,此存儲過程沒有參數,但後跟的()仍然須要。

begin和end語句用來限定存儲過程體,過程自己僅是一個select語句以及avg()函數。

存儲過程在建立以後,被保存在服務器上以供使用,直至被刪除。

注意事項:默認的MySQL語句分隔符爲;。若是命令行實用程序要解釋存儲過程自身內的;字符,則他們不會成爲存儲過程的部分,這樣會使存儲過程當中的SQL出現語法錯誤;解決辦法以下:

delimiter//
create procedure productpricing()
begin
       select avg(prod_price) as priceaverage
       from products;
end//
delimiter;

其中,delimiter//告訴命令行實用程序使用//做爲新的語句結束分隔符;若是要恢復原來的分隔符,可以使用delimiter;。除/以外,任何字符均可以用做語句分隔符。

 

3、刪除存儲過程

drop procedure productpricing;

刪除剛纔建立的存儲過程;注意,後面沒有使用(),只給出存儲過程名。

PS若是指定的存儲過程不存在,則drop procedure將產生一個錯誤。當存儲過程存在,想刪除他時,可使用drop procedure if exists,若是過程不存在也不產生錯誤.

 

4、使用參數

通常來說,存儲過程不顯示結果,而是把結果返回給指定的變量(變量內的一個特定的位置,用來臨時存儲數據)。

下面是上面的存儲過程的修改版本:

create procedure productpricing(
       out p1 decimal(8,2),
       out ph decimal(8,2),
)
begin
       select min(pro_price) into p1
       from products;
       select max(prod_price) into ph
       from products;
end;

此存儲過程當中接受3個參數,關鍵字out指出相應的參數用來從存儲過程傳出一個值(返回給調用者);存儲過程當中檢索出的值,經過into關鍵字保存到相應的變量中,

PSMySQL支持in(傳遞給存儲過程)、out(從存儲過程傳出)和inout(對存儲過程傳入和傳出)類型的參數。

調用上面修改過的存儲過程,必須指定3個變量名,以下:

call productpricing(@pricelow, @pricehigh, @priceaverage);

PS全部存儲過程的變量都必須以「@」開始。

上面的調用語句並不顯示數據,它返回之後能夠顯示的變量;爲了顯示檢索出的價格,使用下面的語句:

select @pricelow, @pricehigh, @priceaverage;

 

5、檢查存儲過程

顯示建立存儲過程的create語句,使用show create procedure語句,好比:

show create procedure ordertotal;

若是想得到詳細的關於存儲過程的信息,如建立時間、建立人等信息,使用show procedure status。

PSshow procedure status列出全部存儲過程,爲限制其輸出,可以使用LIKE指定一個過濾模式,例如:show procedure status like 'ordertotal';

相關文章
相關標籤/搜索