视图
视图与表:从SQL角度来看视图就是一张表
视图与表的唯一区别:是否保存了实际的数据。数据库中的数据实际上会被保存到计算机的存储设备中,但使用视图时并不会将数据保存到存储设备之中,也不会将数据保存到其他任何地方。实际上是他保存的是SELECT语句。
表中存储的是实际数据,而视图中保存的是从表中取出数据所使用的SELECT语句。
视图的优点:1.无需保存数据,可以节省存储设备的容量;2.可以将频繁使用的SELECT语句保存成视图,这样一来就不用每次都重新书写了。
创建视图的方法:
CREATE VIEW 视图名称(视图列名1,视图列名2,...)
AS
SELECT语句
P.S:
SELECT语句需要书写
在AS关键字之后(AS关键字不可省略);
SELECT语句中
列的排列顺序和
视图中列的排列顺序相同
CREATE VIEW ShopSum(name,cnt_name)
AS
SELECT name,COUNT(*)
FROM Shop
GROUP BY name;
解释:创建一个ShopSum视图,其数据来于Shop表按name进行分组计数的结果
视图的使用与表一样:
SELECT name,cnt_name
FROM ShopSum;
1.首先执行定义视图的SELECT语句;2.根据得到的结果,再执行在FROM子句中使用视图的SELECT语句。
多重视图:尽量避免,因为它会降低SQL的性能
--多重视图的创建
CREATE VIEW ShopSumJim(name,cnt_name)
AS
SELECT name,cnt_name
--以视图为基础创建视图
FROM ShopSum
WHERE name='筷子';
1. 定义视图时 不能使用ORDER BY子句(视图和表一样, 数据行都是没有顺序的)
2.当定义视图的SELECT语句满足以下某些条件时,可以对视图进行更新(更新包括:INSERT、DELETE、UPDATE)。条件如下:SELECT语句中未使用DISTINCT;FROM只有一张表;未使用GROUP BY子句;未使用HAVING子句
删除视图:
--删除视图的一般语法
DROP VIEW 视图名称 (视图列名1,视图列名2,视图列名3,...);
子查询
子查询和视图:
子查询:将用来定义视图的SELECT语句直接用于FROM子句当中。子查询的特点概括起来就是一张一次性视图
--创建根据商品名统计商品数据的视图
CREATE VIEW ShopSum(name,cnt_name)
AS
SELECT name,COUNT(*)
FROM Shop
GROUP BY name;
--确认视图是否已经创建成功
SELECT name,cnt_name
FROM ShopSum;
等价查询结果的子查询
SELECT name,cnt_name
FROM (SELECT name,COUNT(*) AS cnt_name
FROM Shop
GROUP BY name) AS ShopSum;
解释:()部分即为子查询,即,将用来定义视图 的SELECT子句直接作用于FROM子句当中;子查询作为内层查询会首先执行;子查询的层数原则上没有限制,但应尽量避免使用多重嵌套的子查询
子查询的名称:
原则上子查询必须使用AS关键字设定名称,此关键字有时可省略
标量子查询:必须而且只能返回1行1列的结果,其返回值可以用在=或者< >这样需要单一值的比较运算符之中
SELECT name,price
FROM Shop
WHERE price >(SELECT AVG(price)
FROM Shop);
解释:从Shop表中选出价格高于平均价格的商品信息;由于WHERE子句中不能使用聚合函数,所以利用标量子查询 SELECT AVG(price) FROM Shop来实现
标量子查询的书写位置:
并不仅仅局限于WHERE子句中,能够使用常数或者列名的地方,无论是SELECT子句、GROUP BY 子句、HAVING子句,还是ORDER BY子句,几乎所有地方都可用。
使用标量子查询时的注意事项:该子查询绝对不能返回多行结果
关联子查询
普通子查询和关联子查询的区别
SELECT name,price
FROM Shop AS S1
WHERE price>(SELECT AVG(price)
FROM Shop AS S2
WHERE S1.name=S2.name --关键语句:关联条件
GROUP BY name);
解释:对表Shop按name分组,选出每组中price大于每组的平均price的商品信息
在细分的组内进行比较时,需要使用关联子查询
关联子查询也是用来对集合进行切分的:关联子查询实际只能返回1行结果
结合条件/关联条件一定要写在子查询中:因为关联名称的作用域