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 |