视图是一个lucky dog,所有实现提供一致的支持,不容易。
假设要检索买了产品号为rgan01的产品的所有顾客,则按之前的方法,使用联结:
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 = 'RGAN01';
如果我们可以把这个查询封装为一个叫做productsCustomers的虚拟表,则可以这么检索出相同的数据:
封装:
create view productscustomers 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;
封装后在mysql workbench左边可以看到这个视图
封装后,利用视图实现查询
select cust_name, cust_contact
from productsCustomers
where prod_id = 'RGAN01';
查询结果一样,但是视图的代码更加简单,想查别的产品随便改产品号即可
如果对视图执行下面的查询,则返回订购了任意产品的顾客,即只要买了产品都列出来
select * from productscustomers;
到现在其实还是不太明白,因为例子只有一个,并且还没说怎么把一个查询封装为视图,只讲了规则和注意事项,没有经手完整示例还是不太明白
见第一节的用示例说明里的示例
select concat(vend_name, '(', vend_country, ')')
as vend_title
from vendors
order by vend_name;
create view vendorlocations as
select concat(vend_name, '(', vend_country, ')')
as vend_title
from vendors;
可以看到,用了两次as,一次是后面跟整个select查询,一次是后面跟计算字段的别名。
现在可以这样:
select * from vendorlocations;
但是下面的代码是错的,我企图对视图检索出的数据按供应商名称来排序结果:
select * from vendorlocations
order by vend_name;
可见视图 vendorlocations中果然没有列,没有数据,他根本不认识vend_name,vend_name是vendors表的列
过滤出所有邮箱地址不为空的客户
create view CustomerEmailList as
select cust_id, cust_name, cust_email
from customers
where cust_email is not null;
用视图过滤掉了邮箱地址为空的行,让他们不显示出来
select * from CustomerEmailList;
查询一个订单中所有产品的相关信息:
select prod_id,
quantity,
item_price,
quantity*item_price as expanded_price
from orderitems
where order_num = 20008;
create view OrderItemsExpanded as
select prod_id,
quantity,
item_price,
quantity*item_price as expanded_price
from orderitems;
于是查询就可以变为:
select *
from OrderItemsExpanded
where order_num = 20008;
注意,这里封装查询为视图时比上面直接用select多加了一个order_num,这一项是必须加的,因为只有加了,才可以用where order_num = 20008;,否则会报错说不认识order_num
大概有一些感觉了,但是还需要大量练习。明白了视图是查询,没有数据了,它只有select后面跟着的那些列,所有对视图用where子句的话只可以识别创建视图时select后面的那些列。
提供了对select语句的封装层次,这个说的好,也感受到了,把一个select语句封装起来了,就可以复用这一个查询。
没想到SQL也有封装和复用的概念呢,果然好的思想在哪里都会有体现。
关键字