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

    技术2022-07-15  43

    文章目录

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

    入一点门

    视图是什么

    视图是一个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(删除是drop view)

    下面的几个示例都是视图常用的用途

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

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

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

    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表的列

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

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

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

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

    select * from CustomerEmailList;

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

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

    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语句

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

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

    总结

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

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

    关键字

    create viewdrop viewas:在视图的创建中必用
    Processed: 0.018, SQL: 9