D3:稍微复杂点的查询

视图

视图和表的区分

“视图不是表,视图是虚表,视图依赖于表”

视图是可执行的sql语句,是对单表数据、多表数据进行关联分析得到业务所需要的处理过的数据,存储的是sql语句,不是真实的表数据,只有执行时才会生成数据;
是保存了实际的数据;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StgOO9ku-1655613160688)(en-resource://database/1110:1)]

视图的作用

  • 整合频繁使用select语句,提高效率且使业务数据更加清晰;
  • 不对外公开数据表全部字段,增强数据保密;
  • 降低数据冗余;

创建视图

CREATE VIEW <视图名称>(<列名1>,<列名2>,...) AS <SELECT语句>   

注意事项

1、定义视图的select语句中不能包含order by子句,因为视图和表一样,数据行都是没有顺序的;
2、创建视图时的字段与select的字段是从首到尾一一对应的关系,类似于两个list,命名不需要一样。如果视图的字段数少于select的字段数,会报错;如果视图的字段数多余select的字段数,在对应最后一个list时
DROP VIEW <视图名1> [ , <视图名2> …],会将视图后面的所有字段合并(包括英文逗号)

删除视图

DROP VIEW <视图名1> [ , <视图名2> …]  

子查询

类似于视图,将用户视图的select语句作用于from语句中;但子查询是一次性的,不会像视图那样存在存储介质中,执行完select语句后就会消失。
需求:查询出销售单价高于平均销售单价的商品
SQL语句:

SELECT product_id, product_name, sale_price
  FROM product
 WHERE sale_price > (SELECT AVG(sale_price) FROM product);

与正常sql理解不一样的关联子查询

书写顺序:SELECT》FROM 》WHERE》GROUP BY》HAVE》ORDER BY
执行顺序:FROM 》WHERE》GROUP BY》HAVE》SELECT》ORDER BY

理解链接:https://zhuanlan.zhihu.com/p/41844742
需求:选取出各商品种类中高于该商品种类的平均销售单价的商品
注意和子查询的需求做比较!
SQL语句:

SELECT product_type, product_name, sale_price
  FROM product AS p1
 WHERE sale_price > (SELECT AVG(sale_price)
   FROM product AS p2
                      WHERE p1.product_type =p2.product_type
   GROUP BY product_type);

where p1.product_type =p2.product_type关联子查询的关键!

  1. 首先执行不带WHERE的主查询;
  2. 根据主查询讯结果匹配product_type,获取子查询结果;
  3. 将子查询结果再与主查询结合执行完整的SQL语句

1、关联子查询的执行逻辑完全不同于正常的SELECT语句。
2、关联子查询执行逻辑如下:
(1)先从主查询的Product表中product _type列取出第一个值,进入子查询中,得到子查询结果,然后返回父查询,判断父查询的where子句条件,则返回整个语句的第1条结果。
(2)重复上述操作,直到所有主查询中的Product表中product _type列记录取完为止。得出整个语句的结果集,就是最后的答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值