视图是一个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;到现在其实还是不太明白,因为例子只有一个,并且还没说怎么把一个查询封装为视图,只讲了规则和注意事项,没有经手完整示例还是不太明白
下面的几个示例都是视图常用的用途
见第一节的用示例说明里的示例
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也有封装和复用的概念呢,果然好的思想在哪里都会有体现。
关键字
create viewdrop viewas:在视图的创建中必用