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';

相关文章
相关标签/搜索