目录
5-1 视图
一、视图和表
二、创建视图的方法
三、视图的使用方法
四、视图的两大限制
五、删除视图
5-2 子查询
一、子查询和视图
二、子查询的名称
三、标量子查询
四、标量子查询的书写位置
五、使用标量子查询时的注意事项
5-1 视图
一、视图和表
1、 视图和表从SQL的角度来看,两者是相同的。两者的区别在于表中保存的是实际的数据,而视图中保存的是select语句。(视图本身并不存储数据)
2、视图的优点
(1)由于视图无需保存数据,因此可以节省存储设备的容量。
表中存储的是实际的数据,而视图中保存的是从表中取出数据所使用的SELECT语句。
(2)可以将频繁使用的select语句保存成视图就不用每次都重新书写了。
应该将经常使用的SELECT语句做成视图。
(3)视图中的数据会随着原表的变化自动更新。视图归根到底就是select语句,所谓的参照视图就是执行select语句的意思。
二、创建视图的方法
创建视图需要使用CREATE VIEW语句。
语法如下:
CREATE VIEW 视图名称(<视图列名1> ,<视图列名2>,……)
AS <SELECT语句>
举个栗子:做一个视图
CREATE ShohinSum(shohin_bunrui,cnt_shohin) ----视图的列名
AS SELECT shohin_bunrui,COUNT(*)
FROM Shohin ----视图定义中的主体(内容只是一条select语句)
GROUP BY shohin_bunrui;
三、视图的使用方法
1、使用视图的查询
(1)首先执行定义视图的SELTCT语句
(2)根据得到的结果,再执行FROM子句中使用视图的SELECT语句
我们应该避免在视图的基础上创建视图,多重视图会降低SQL的性能。
四、视图的两大限制
1、定义视图时不能使用ORDER BY子句
因为视图和表一样,数据行是没用顺序的
2、对视图进行更新
大多数时候视图是不可以被更新的但也有些情况可以被更新
(1)select子句中未使用distinct
(2)from子句中只有一张表
(3)未使用group by子句
(4)未使用having子句
所以我们的视图和表需要同时进行更新,因此通过聚合得到的视图无法进行更新。(简单可以理解为视图是表的一部分,只更新视图并不会完全将表更新)
3、能够更新视图的情况
视图并不是通过聚合表之后所得到的
五、删除视图
删除视图需要使用 DROP VIEW语句
语法如下:
DROP VIEW 视图名称(<视图列名1>,<视图列名2>,……)
5-2 子查询
一些重点总结
1、子查询就是一次性的视图(SELECT语句)。与视图不同,子查询在SELECT语句执行完毕之后就会消失。
2、由于子查询需要命名,因此需要根据处理内容来指定恰当的名称。
3、标量子查询就是只能返回一行一列的子查询。
一、子查询和视图
子查询就是直接在FROM子句中使用定义视图的SELECT语句
举个栗子:
SELECT shohin_bunrui,cnt_shohin
FROM(SELECT shohin_bunrui,COUNT(*) AS cnt_shohin
FROM Shohin
GROUP BY shohin_bunrui)AS ShohinSum;
子查询作为内层查询为首先执行
二、子查询的名称
子查询必须设立名称,设立名称时需要使用AS关键字
三、标量子查询
1、什么时标量
标量子查询就是返回单一值的子查询。
2、在WHERE 子句中使用标量子查询
我们已经知道WHERE子句中不能使用AVG这样的聚合函数
举个栗子:
SELECT shohin_id,shohinmei,hanbai_tanka
FROM Shohin
WHERE hanbai_tanka > AVG(hanbai_tanka);
这样的语句是无法实现的
但通过标量子查询(SELECT语句的嵌套)我们就可以实现
SELECT shohin_id,shohinmei,hanbai_tanka
FROM Shohin
WHERE hanbai_tanka > (SELECT AVG(hanbai_tanka)
FROM Shohin);
四、标量子查询的书写位置
1、在SELECT子句中使用标量子查询
2、在HAVING子句中使用标量子查询
3、GROUP BY、HAVING、ORDER BY这些都可以使用标量子查询
五、使用标量子查询时的注意事项
该子查询绝对不能返回多行结果。如果返回了多行结果那么它就是一个简单的子查询了