SQL基础学习5

来源:互联网 发布:java oa项目源代码 编辑:程序博客网 时间:2024/05/29 16:45

视图

视图与表:从SQL角度来看视图就是一张表

视图与表的唯一区别:是否保存了实际的数据。数据库中的数据实际上会被保存到计算机的存储设备中,但使用视图时并不会将数据保存到存储设备之中,也不会将数据保存到其他任何地方。实际上是他保存的是SELECT语句。

表中存储的是实际数据,视图中保存的是从表中取出数据所使用的SELECT语句。

视图的优点:1.无需保存数据,可以节省存储设备的容量;2.可以将频繁使用的SELECT语句保存成视图,这样一来就不用每次都重新书写了。

创建视图的方法:

CREATE VIEW 视图名称(视图列名1,视图列名2,...)ASSELECT语句 
P.S:SELECT语句需要书写在AS关键字之后(AS关键字不可省略)SELECT语句列的排列顺序视图中列的排列顺序相同

CREATE VIEW ShopSum(name,cnt_name)ASSELECT name,COUNT(*)FROM ShopGROUP BY name;
解释:创建一个ShopSum视图,其数据来于Shop表按name进行分组计数的结果

视图的使用与表一样:

SELECT name,cnt_nameFROM ShopSum;


使用视图的查询:通常需要执行2条以上的SELECT语句

1.首先执行定义视图的SELECT语句;2.根据得到的结果,再执行在FROM子句中使用视图的SELECT语句。


多重视图:尽量避免,因为它会降低SQL的性能

--多重视图的创建CREATE VIEW ShopSumJim(name,cnt_name)ASSELECT name,cnt_name--以视图为基础创建视图FROM ShopSumWHERE 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)ASSELECT name,COUNT(*)FROM ShopGROUP BY name;--确认视图是否已经创建成功SELECT name,cnt_nameFROM ShopSum;
等价查询结果的子查询

SELECT name,cnt_nameFROM (SELECT name,COUNT(*) AS cnt_name      FROM Shop      GROUP BY name) AS ShopSum;

解释:()部分即为子查询,即,将用来定义视图 的SELECT子句直接作用于FROM子句当中;子查询作为内层查询会首先执行;子查询的层数原则上没有限制,但应尽量避免使用多重嵌套的子查询

子查询的名称:

原则上子查询必须使用AS关键字设定名称,此关键字有时可省略

标量子查询:必须而且只能返回1行1列的结果,其返回值可以用在=或者< >这样需要单一值的比较运算符之中

SELECT name,priceFROM ShopWHERE price >(SELECT AVG(price)              FROM Shop);
解释:从Shop表中选出价格高于平均价格的商品信息;由于WHERE子句中不能使用聚合函数,所以利用标量子查询 SELECT AVG(price) FROM Shop来实现

标量子查询的书写位置:

并不仅仅局限于WHERE子句中,能够使用常数或者列名的地方,无论是SELECT子句、GROUP BY 子句、HAVING子句,还是ORDER BY子句,几乎所有地方都可用。

使用标量子查询时的注意事项:该子查询绝对不能返回多行结果


关联子查询

普通子查询和关联子查询的区别

SELECT name,priceFROM Shop AS S1WHERE price>(SELECT AVG(price)FROM Shop AS S2 WHERE S1.name=S2.name --关键语句:关联条件GROUP BY name);
解释:对表Shop按name分组,选出每组中price大于每组的平均price的商品信息

细分的组内进行比较时,需要使用关联子查询

关联子查询也是用来对集合进行切分的:关联子查询实际只能返回1行结果

结合条件/关联条件一定要写在子查询中:因为关联名称的作用域

0 0