视图
视图和表的区分
“视图不是表,视图是虚表,视图依赖于表”
视图是可执行的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关联子查询的关键!
- 首先执行不带WHERE的主查询;
- 根据主查询讯结果匹配product_type,获取子查询结果;
- 将子查询结果再与主查询结合执行完整的SQL语句
1、关联子查询的执行逻辑完全不同于正常的SELECT语句。
2、关联子查询执行逻辑如下:
(1)先从主查询的Product表中product _type列取出第一个值,进入子查询中,得到子查询结果,然后返回父查询,判断父查询的where子句条件,则返回整个语句的第1条结果。
(2)重复上述操作,直到所有主查询中的Product表中product _type列记录取完为止。得出整个语句的结果集,就是最后的答案。