这一章讲了关于创建视图、操作视图的知识.
视图:是不保存实际数据的,来自于表的,保存好的 SELECT 语句.
使用视图有三个优点:
- 无需保存数据,因此节省储存设备的空间
- 视图可以命名,然后被保存.因而可以重复使用.
- 视图会自动更新,随着原表的数据的变化而变化
视图的创建与删除
创建视图
格式:
CREATE VIEW <viewname>
(<vcol1>
,<vcol2>
, ...)
AS
SELECT ...
例子:
CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type;
需要注意的几点:
- 多重视图的概念:在 SELECT 语句的 FROM 子句中,可以选用一视图,形成视图的视图,即多重视图.
- 视图的更新:视图的更新会带来原表的更新,因此具有聚合的视图是无法更新的,即无法执行 INSERT、DELETE、UPDATE 一类操作.
删除视图
格式:
DROP VIEW <viewname>
(<vcol1>
, <vcol2>
,...)
子查询:视图为基础的查询
子查询:以视图为基础的查询
格式:
将用来定义视图的 SELECT 语句直接用于 FROM 子句当中.
如下:
SELECT <vcol1>
, <vcol2>
,...
FROM <viewname>
需要注意:
查询的时候由内向外,即优先进行子查询,然后进行查询.
标量子查询
定义:
必须而且只能返回 1 行 1 列的结果的查询叫做标量子查询.
功能:
在查询的 WHERE 子句中,其中不能出现 AVG 等聚合函数,因此可以使用标量子查询,利用优先计算子查询的特性来得到想要的结果.
举例:
SELECT product_id, product_name, sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product);
关联子查询
原因:
当进行标量子查询的时候,返回多条记录进行笔记会出错.关联子查询可以解决这个问题,使得在每种情况下,返回特定的值.
格式:
其在子查询中加上了特定的 WHERE 语句.
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
);
语法: 在 WHERE 子句中,使用<tablename>.<columnnaem>
的方式.