视图
定义:视图是一个虚拟的表,不同于直接操作数据表,视图是依据SELECT语句来创建的。视图是基于真实表的一张虚拟的表,其数据来源均建立在真实表的基础上
存在意义:
- 通过定义视图可以将频繁使用的SELECT语句保存以提高效率。
- 通过定义视图可以使用户看到的数据更加清晰。
- 通过定义视图可以不对外公开数据表全部字段,增强数据的保密性。
- 通过定义视图可以降低数据的冗余。
基本语法:
CREATE VIEW <视图名称>(<列名1>,<列名2>,…) AS <SELECT语句>#创建
ALTER VIEW <视图名> AS <SELECT语句>#修改
DROP VIEW <视图名1> [ , <视图名2> …]#删除
因为视图是一个虚拟表,所以对视图的操作就是对底层基础表的操作,所以在修改时只有满足底层基本表的定义才能成功修改。一般不推荐通过视图修改。
子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询。子查询就是将用来定义视图的 SELECT 语句直接用于 FROM 子句当中,而且由于子查询是一次性的,所以子查询不会像视图那样保存在存储介质中, 而是在 SELECT 语句执行之后就消失了。
- 嵌套子查询
SELECT product_type, cnt_product
FROM (SELECT *
FROM (SELECT product_type,
COUNT(*) AS cnt_product
FROM product
GROUP BY product_type) AS productsum
WHERE cnt_product = 4) AS productsum2;
其中最内层的子查询我们将其命名为productSum,这条语句根据product_type分组并查询个数,第二层查询中将个数为4的商品查询出来,最外层查询product_type和cnt_product两列。
虽然嵌套子查询可以查询出结果,但是随着子查询嵌套的层数的叠加,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);