
5.1 视图
视图和表的区别:是否保存了实际的数据。
视图中保存的是从表中取出数据所使用的SELECT语句
表中存储的是实际数据(优点:节省存储设备容量、可将经常使用的SELECT语句做成视图无需重新书写、保证数据的最新状态)
注:应该将经常使用的SELECT语句做成视图。
创建视图:
CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……)
AS
<SELECT语句>
注:定义视图时不要使用ORDER BY子句( PostgreSQL 除外)。
删除表中数据:
DELETE FROM <表名> ;
使用视图的查询:
SELECT <视图列名1>, <视图列名2>, <视图列名3>, ……
FROM <视图表名>;
注:应该避免在视图的基础上创建视图,对多数 DBMS 来说,多重视图会降低 SQL 的性能。
更新视图:定义视图的 SELECT 语句能够满足某些条件,那么这个视图就可以被更新,有代表性条件如下。
SELECT 子句中未使用 DISTINCT
FROM 子句中只有一张表
未使用 GROUP BY 子句
未使用 HAVING 子句
注:视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新。
删除视图:
DROP VIEW 视图名称(<视图列名1>, <视图列名2>, ……)

5.2 子查询
子查询特点:概括起来就是一张一次性视图。
子查询:
SELECT <视图列名1>, <视图列名2>, <视图列名3>, ……
FROM (直接书写定义视图的select语句) AS <子查询名称>;
注:
子查询作为内层查询会首先执行。
原则上子查询必须设定名称。
增加子查询的层数:子查询的层数原则上没有限制,因此可以像“子查询的 FROM 子句中还可以继续使用子查询,该子查询的 FROM 子句中还可以再使用子查
注:子查询嵌套层数增加,难懂性能变差,尽量避免使用多层嵌套的子查询。
标量子查询:返回单一值的子查询,特殊性质为必须而且只能返回 1 行 1列的结果。
注:
标量子查询的返回值可以用在 = 或者 <> 这样需要单一值的比较运算符之中。
通常任何可以使用单一值的位置都可以使用标量子查询。
标量子查询不能返回多行结果,因此不能使用在比较运算符中。

5.3 关联子查询
关联子查询:在使用关联子查询时,需要在表所对应的列名之前加上表的别名,以“< 表名 >.< 列名 >”的形式记述。
注:
在细分的组内进行比较时,需要使用关联子查询。
避免将关联条件写在子查询之外的外层查询之中。
end