SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)

文章目录

  • 入一点门
    • 视图是什么
      • 用示例说明
    • 视图的常见应用
    • 视图的规则
    • 小结
  • 创建视图:create view(删除是drop view)
    • 示例1:用视图来简化复杂的联结
    • 示例2: 用视图格式化检索出的数据
    • 示例3:用视图过滤掉不想要的数据
    • 示例4:用视图简化计算字段的使用
    • 小结
  • 总结

入一点门

视图是什么

SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第1张图片
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
视图是一个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左边可以看到这个视图
SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第2张图片
封装后,利用视图实现查询

select cust_name, cust_contact
from productsCustomers
where prod_id = 'RGAN01';

在这里插入图片描述
查询结果一样,但是视图的代码更加简单,想查别的产品随便改产品号即可

在这里插入图片描述
在这里插入图片描述
而且可重用
在这里插入图片描述


如果对视图执行下面的查询,则返回订购了任意产品的顾客,即只要买了产品都列出来

select * from productscustomers;

SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第3张图片

视图的常见应用

在这里插入图片描述

视图的规则

SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第4张图片

小结

到现在其实还是不太明白,因为例子只有一个,并且还没说怎么把一个查询封装为视图,只讲了规则和注意事项,没有经手完整示例还是不太明白

创建视图:create view(删除是drop view)

在这里插入图片描述
在这里插入图片描述
下面的几个示例都是视图常用的用途

示例1:用视图来简化复杂的联结

见第一节的用示例说明里的示例

示例2: 用视图格式化检索出的数据

select concat(vend_name, '(', vend_country, ')')
as vend_title
from vendors
order by vend_name;

SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第5张图片
在这里插入图片描述

create view vendorlocations as
select concat(vend_name, '(', vend_country, ')')
as vend_title
from vendors;

可以看到,用了两次as,一次是后面跟整个select查询,一次是后面跟计算字段的别名。
在这里插入图片描述
现在可以这样:

select * from vendorlocations;

SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第6张图片
但是下面的代码是错的,我企图对视图检索出的数据按供应商名称来排序结果:

select * from vendorlocations
order by vend_name;

在这里插入图片描述
可见视图 vendorlocations中果然没有列,没有数据,他根本不认识vend_name,vend_name是vendors表的列

示例3:用视图过滤掉不想要的数据

过滤出所有邮箱地址不为空的客户

create view CustomerEmailList as 
select cust_id, cust_name, cust_email
from customers
where cust_email is not null;

用视图过滤掉了邮箱地址为空的行,让他们不显示出来

select * from CustomerEmailList;

SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第7张图片

示例4:用视图简化计算字段的使用

查询一个订单中所有产品的相关信息:

select prod_id, 
	   quantity,
       item_price,
       quantity*item_price as expanded_price
from orderitems
where order_num = 20008;

SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第8张图片
可以把这个查询转换为一个视图:

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;

SQL(十七)视图(即虚拟的表,可简化之前的SQL操作)_第9张图片

注意,这里封装查询为视图时比上面直接用select多加了一个order_num,这一项是必须加的,因为只有加了,才可以用where order_num = 20008;,否则会报错说不认识order_num
在这里插入图片描述

小结

  • 一个视图只能有一个select语句

在这里插入图片描述
在这里插入图片描述

  • 视图主要是用来简化复杂操作的,包括计算字段,格式化,过滤等等。

大概有一些感觉了,但是还需要大量练习。明白了视图是查询,没有数据了,它只有select后面跟着的那些列,所有对视图用where子句的话只可以识别创建视图时select后面的那些列。

总结

在这里插入图片描述
提供了对select语句的封装层次,这个说的好,也感受到了,把一个select语句封装起来了,就可以复用这一个查询。

没想到SQL也有封装和复用的概念呢,果然好的思想在哪里都会有体现。

关键字

  • create view
  • drop view
  • as:在视图的创建中必用

你可能感兴趣的:(数据库)