SQL基础学习5
2015-11-08 10:58
204 查看
视图
视图与表:从SQL角度来看视图就是一张表
视图与表的唯一区别:是否保存了实际的数据。数据库中的数据实际上会被保存到计算机的存储设备中,但使用视图时并不会将数据保存到存储设备之中,也不会将数据保存到其他任何地方。实际上是他保存的是SELECT语句。
表中存储的是实际数据,而视图中保存的是从表中取出数据所使用的SELECT语句。
视图的优点:1.无需保存数据,可以节省存储设备的容量;2.可以将频繁使用的SELECT语句保存成视图,这样一来就不用每次都重新书写了。
创建视图的方法:
视图的使用与表一样:
使用视图的查询:通常需要执行2条以上的SELECT语句
1.首先执行定义视图的SELECT语句;2.根据得到的结果,再执行在FROM子句中使用视图的SELECT语句。
多重视图:尽量避免,因为它会降低SQL的性能
视图的限制:通过聚合得到的视图无法进行更新
1.定义视图时不能使用ORDER BY子句(视图和表一样,数据行都是没有顺序的)
2.当定义视图的SELECT语句满足以下某些条件时,可以对视图进行更新(更新包括:INSERT、DELETE、UPDATE)。条件如下:SELECT语句中未使用DISTINCT;FROM只有一张表;未使用GROUP BY子句;未使用HAVING子句
删除视图:
子查询
子查询和视图:
子查询:将用来定义视图的SELECT语句直接用于FROM子句当中。子查询的特点概括起来就是一张一次性视图
解释:()部分即为子查询,即,将用来定义视图 的SELECT子句直接作用于FROM子句当中;子查询作为内层查询会首先执行;子查询的层数原则上没有限制,但应尽量避免使用多重嵌套的子查询
子查询的名称:
原则上子查询必须使用AS关键字设定名称,此关键字有时可省略
标量子查询:必须而且只能返回1行1列的结果,其返回值可以用在=或者< >这样需要单一值的比较运算符之中
标量子查询的书写位置:
并不仅仅局限于WHERE子句中,能够使用常数或者列名的地方,无论是SELECT子句、GROUP BY 子句、HAVING子句,还是ORDER BY子句,几乎所有地方都可用。
使用标量子查询时的注意事项:该子查询绝对不能返回多行结果
关联子查询
普通子查询和关联子查询的区别
在细分的组内进行比较时,需要使用关联子查询
关联子查询也是用来对集合进行切分的:关联子查询实际只能返回1行结果
结合条件/关联条件一定要写在子查询中:因为关联名称的作用域
视图与表:从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;
使用视图的查询:通常需要执行2条以上的SELECT语句
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行结果
结合条件/关联条件一定要写在子查询中:因为关联名称的作用域
相关文章推荐
- mysql show命令集合
- 经典SQL语句大全
- 数据库中间件OneProxy and onemysql
- mongodb通过ObjectId 来更新数据
- 在.NET 中使用mysql时间问题,
- install redis service as windows service in windows platform--在windows平台下以windows服务方式安装redis
- 关于mysql-5.7.9-winx64.zip没有setup.exe问题
- 根据数据库中的某一列的物理地址,构建出索引的二叉树
- Mysql学习篇之---Windows环境下安装
- 数据库与共享内存
- 点破Redis的VM
- 图解mysql块读取代码
- C语言版Mysql存储块(page)格式读取工具(源代码)
- Mysql与Oracle group by的不同之处
- MariaDB 5.5.34 QPS bug手记
- Redis的Client设计
- ubuntu 14.04 安装mysql server初级教程
- mysql 1064 USING BTREE问题
- Python 的数据库编程
- Oracle查看表空间使用率(包括临时表空间)