MySQL视图和存储过程

MySQL视图和存储过程

一. 视图

视图是一种特殊的表,但不包含表中应有的任何列和数据,只包含使用时动态检索数据的查询(即:sql查询语句)。

使用视图的目的,在本质上就是用来查看存储在别处的数据。

【引例】

/*使用sql查询*/
select cust_name,cust_contact from customers,orders,orderitems
where customers.cust_id=orders.cust_id
and orderitems.order_num=orders.order_num
and prod_id='TNT2';
  • 查询结果
cust_name cust_contact
1 Yosemite Place Y Sam
2 Coyote Inc. Y Lee

/*创建视图*/
create view productcustomers AS
    select cust_name,cust_contact,prod_id
    from customers,orders,orderitems
    where customers.cust_id=orders.cust_id 
    and orderitems.order_num=orders.order_num;
    
/*查询结果*/
select cust_name,cust_contact from productcustomers where prod_id='TNT2';
  • 查询结果
cust_name cust_contact
1 Yosemite Place Y Sam
2 Coyote Inc. Y Lee

 

从此引例中可以看出,所谓视图就是封装了一堆的sql查询语句
 

⭐️【作用】

  • 重用sql。
  • 简化复杂的sql操作,封装后可以方便的使用视图,而不必知道它的基本查询细节。
  • 保护数据,可以只授予表的特定部分的访问权限而不是整个表的访问权限。

⭐️【规定】

  • 名字唯一(不能与表名和其他视图名重名)
  • 视图不能创建索引,也不能有关联的触发器
  • 视图和表可以混着用

 
【案例一】用视图封装格式

/*
concat()函数
功能:将多个字符串连接成一个字符串。
语法:concat(str1, str2,...)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

RTRIM(str)
返回删除了后面空格字符的字符串str。

LTRIM(str)
返回删除了前面空格字符的字符串str

*/
select CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')') AS vend_title
from vendors
order by vend_name;
  • 查询结果
vend_title
1 ACME(USA)
2 Anvils R Us(USA)
3 Furball Inc.(USA)
4 Jet Set(England)
5 Jouets Et Ours(France)
6 LT Supplies(USA)
/*创建视图*/
create view vendorlocation as
select CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')') AS vend_title
from vendors
order by vend_name;
/*使用视图*/
select * from vendorlocation;

  

二. 存储过程

先考虑这么一个问题:当我们执行某个处理需要针对许多表的多条sql语句,语句执行的顺序也是不固定的,可能会随某些数据在表中存不存在而发生变化,这个时候怎么处理?

简单来说,存储过程就是为了方便以后使用而事先保存的sql语句集合。

【引例】

/*
    创建存储过程
    1. 如果需要参数,可以在()中给出,即使没有参数,也要写()。
    2. 用 begin 和 end 来限制执行体,end要分号结尾。
    
  */
create procedure productprice()
begin
    select AVG(prod_price) as priceAvg from products;
end;

/*调用存储过程*/
call productprice();
  • 结果展示
priceAvg
1 16.133571

 

上一篇:fzu 1913 Easy Comparison(字符串)


下一篇:第六章 使用集合