第五章 复杂查询

5.1 视图

5.1.1 视图和表

从SQL的角度来看,视图和表是相同的。两者的区别在于表中保存的是实际的数据,而视图中保存的是SELECT语句。视图本身并不存储数据。

视图的优点:1.视图无需保存数据

2.将频繁使用SELECT语句保存成视图

代码1.通过视图等SELECT语句保存数据

SELECT shohin_bunrui,SUM(hanbai_tanka),SUM(shiire_tanka)FROM Shohin
GROUP BY shohin_bunrui;

输出结果:

 

5.1.2 创建视图的方法

代码2.创建视图时使用CREATE VIEW语句,语法如下:

CREATE VIEW 视图名称(<视图列名1>,<视图列名2>,...)
AS
<SELECT语句>

SELECT语句需要书写在AS关键字之后,SELECT语句中列的排列顺序和视图中列的排列顺序相同。

代码3.ShohinSum视图

CREATE VIEW ShohinSum ( shohin_bunrui, cnt_shohin)
AS
SELECT shohin_bunrui,COUNT(*)FROM ShohinGROUP BY shohin_bunrui;

输出结果:

此处AS的定义与定义别名时使用的AS不相同。

代码4.使用视图

SELECT shohin_bunrui,cnt_shohinFROM ShohinSum;

输出结果:

定义视图时使用任何SELECT语句,即可以使用WHERE,GROUP BY,HAVING,也可以通过SELECT *来指定全部列。

使用视图查询:在FROM子句中使用视图查询有以下两个步骤

1.首先执行定义视图的SELECT语句

2.根据得到的结果,再执行在FROM子句中使用视图的SELECT语句

使用视图查询通常需要执行2条以上的SELECT语句。这里没有使用2条而使用了2条以上是因为还可能出现以视图为基础创建出的类似于楼中楼那样的多重视图。

代码5.视图ShohinSumJim

CREATE VIEW ShohinSumJim (shohin_bunrui,cnt_shohin)
AS
SELECT shohin_bunrui,cnt_shohinFROM ShohinSumWHERE shohin_bunrui='办公用品';--确认是否创建出了视图
SEELCT shohin_bunrui,cnt_shohinFROM ShohinSumnJim;

  

虽然语法上没有错误,但是我们还是应该尽量避免在视图的基础上创建视图。这是因为对于大多数DBMS来说,多重视图会降低SQL的性能。

5.1.3 视图的限制1——定义视图时不能使用ORDER BY子句

原因是视图和表一样,数据行都是没有顺序的。

5.1.4 视图的限制2——对视图进行更新

标准SQL规定:如果定义视图的SELECT语句能够满足某些条件,那么这个视图就可以被更新。下面是一些比较有代表性的条件。

条件:1.SELECT子句中未使用DISTINCT

2.FROM 子句中只有一张表

3.未使用GROUP BY子句

4.未使用HAVING子句

能够更新视图的情况:

代码6.可以更新的视图

CREATE VIEW ShohinJim (shohin_id,shohin_mei,shohin_bunrui,hanbai_tanka,shiire_tanka,torokubi)
AS
SELECT *FROM ShohinWHERE shohin_bunrui = '办公用品';

输出结果:

  

代码7.向视图中添加数据行

INSERT INTO ShohinJim VALUES ('0009','印章',‘办公用品’,95,10,'2009-11-30');

输出结果:

注意事项:

在PostgreSQL中,执行上面的向视图中添加数据行代码会出现错误,因为PostgreSQL中的视图会被初始设定为只读

代码8.允许PostgreSQL对视图进行更新

--PostgreSQLCREATE OR REPLACE RULE insert_rule
AS ON INSERT
TO ShohinJim DO INSTEAD
INSERT INTO Shohin VALUES(new.shohin_id,new.shohin_mei,new.shohin_bunrui,new.hanbai_tanka,new.shiire_tanka,new.torokubi);

--确认数据是否已经添加到视图中了
SELECT*FROM ShohinJim;

输出结果:

--确认数据是否已经添加到原表中了
SELECT*FROM Shohin;

输出结果:

5.1.5 删除视图

代码9.删除视图需要使用DROP VIEW语句,语法如下:

DROP VIEW (<视图列名1>,<视图列名2>,......)

  

代码10.删除视图

DROP VIEW ShohinSum;

输出结果;

  

在PostgreSQL中,如果想要删除以视图为基础创建出来的多重视图的话,由于存在关联的视图,所以会发生如下错误:

ERROR:由于存在关联视图,所以无法删除视图shohinsum

DETALL:视图shohinsumjim与视图shohinsum相关联

HINT:删除关联对象请使用DROP...CASCADE

代码11.在PostgreSQL中使用CASCADE选项来删除关联视图

DROP VIEW ShohinSum CASCADE;

输出结果:

  

5.2 子查询

5.2.1 子查询和视图

子查询就是一张一次性的视图,子查询就是将用来定义视图的SELECT语句直接用于FROM子句之中。

代码12.视图ShohinSun和确认用的SELCT语句

--根据商品种类统计商品数量的视图
CREATE VIEW ShohinSum (shohin_bunrui,cnt_shohin)
AS
SELECT shohin_bunrui,COUNT(*)FROM ShohinGROUP BY Shohin_bunrui;--确认视图是否已经创建成功
SELECT shohin_bunrui,cnt_shohinFROM ShohinSum;

输出结果:

代码13.子查询

--SQL Server、DB2、PostgreSQL、MySQL
--直接在FROM子句中使用定义视图的SELECT语句SELECT shohin_bunrui,cnt_shohinFROM (SELECT shohin_bunrui,COUNT(*) AS cnt_shohinFROM ShohinGROUP BY shohin_bunrui) AS ShohinSum;

输出结果:

  (在Oracle中,不能使用AS。)

实际上,该SELECT语句包含嵌套结构,首先会执行FROM子句中的SELECT语句,然后才会执行外层的SELECT语句。

子查询作为内层会首先执行。

增加查询层数

子查询在层数原则上是没有限制的,可以无限嵌套下去。

代码14.尝试增加子查询的嵌套层数

--SQL Server、DB2、PostgreSQL、MySQLSELECT shohin_bunrui,cnt_shohinFROM (SELECT * FROM ( SELECT  shohin_bunrui,COUNT(*) AS cnt_shohinFROM ShohinGROUP BY shohin_bunrui) AS ShohinSumWHERE cnt_shohin = 4 ) AS ShohinSum2;

输出结果:

  (在Oracle中不能使用AS)

随着子查询嵌套层数的增加,SQL语句变得越来越难读懂,性能也会越来越差。因此,应该避免使用多层嵌套的子查询。

5.2.2 子查询的名称

之前的例子中,我们给子查询设定了“ShohinSum”等名称。为子查询设定名称时需要使用AS关键字,该关键字有时可以省略。

5.2.3 标量子查询

标量子查询就是返回单一值的子查询,必须而且只能返回一行一列的结果。

在WHERE子句中使用标量子查询:

我们需要查询出销售单价高于平均销售单价的商品的做法

代码15.计算平均销售单价的标量子查询

SELECT AVG(hanbai_tanka)FROM Shohin;

输出结果:

代码16.选取出销售单价(hanbai_tanka)高于全部商品的平均单价商品

SELECT shohin_id,shohin_mei,hanbai_tankaFROM ShohinWHERE hanbai_tanka > (SELECT AVG(hanbai_tanka)FROM Shohin);

输出结果:

5.2.4 标量子查询的书写位置

标量子查询的书写位置不仅局限于WHERE子句中,通常任何可以使用单一值的位置都可以使用。也就是说,能够使用常数或者列名的地方,无论是SELECT子句、GROUP BY子句、HAVING子句、还是ORDER BY子句,几乎所有地方都可以使用。

代码17.在SELECT子句中使用标量子查询

SELECT   shohin_id,shohin_mei,hanbai_tanka,(SELECT AVG(hanbai_tanka)FROM Shohin) AS avg_tankaFROM Shohin;

输出结果:

代码18.在HAVING子句中使用标量子查询

SELECT shohin_bunrui,AVG(hanbai_tanka)FROM Shohin
GROUP BY shohin_bunrui
HAVING AVG(hanbai_tanka) > (SELECT AVG(hanbai_tanka)FROM Shohin);

输出结果:

  

5.2.5 使用标量子查询时的注意事项

子查询返回了多行结果,那么它就不再是标量子查询,而仅仅是一个普通的子查询。因此不能被用在=或者<>等需要单一输入值的运算符当中,也不能在SELECT等子句当中

5.3 关联子查询

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

代码19.通过关联子查询按照商品种类对平均销售单价进行比较

--SQL、DB2、PostgreSQL,MySQL
SELECT shohin_id,shohin_mei,hanbai_tankaFROM Shohin AS S1WHERE hanbai_tanka > (SELECT AVG(hanbai_tanka)FROM Shohin AS S2WHERE S1.shohin_bunrui = S2.shohin_bunruiGROUP BY shohin_bunrui);

输出结果:

  这里起关键作用的地方就是在子查询中添加的WHERE子句的条件

5.3.2 关联子查询也是用来对集合进行切分的

5.3.3 结合条件一定要写在子查询中

子查询内部设定的关联名称,只能在该子查询内部使用

转载于:https://www.cnblogs.com/zsdeblog/p/9187437.html

SQL基础教程第五章笔记相关推荐

  1. Web前端开发精品课HTML CSS JavaScript基础教程第五章课后编程题答案

    编程题: 图5-15所示为一个问卷调查的网页,请制作出来.要求:大标题用h1标签:小题目用h3标签:前两个问题使用有序列表:最后一个问题使用无序列表. 用VS2013新建ASP.NET空网站,添加新项 ...

  2. SQL SERVER2000教程-第五章 处理数据 第十三节 设定数字日期格式

    SQL Server 2000允许用指定的数字月份指定日期数据,当使用数字日期格式时,在字符串中以斜 杠(\)>.连字符(-)或句号(.)作为分隔符来指定月.日.年,字符串必须以下面的形式出现: ...

  3. SQL基础教程学习第六站:数据更新

    仅用于记录学习,欢迎批评指正,共同交流,共同进步,大神勿喷 系列文章 SQL基础教程学习第一站:PostgreSQL下载安装以及如何创建并登录数据库: SQL基础教程学习第二站:数据库基本知识: SQ ...

  4. sql基础教程和mysql基础教程_书评「SQL基础教程(第2版)」| 你应该知道的基础知识点梳理·上...

    写在前面关于这本书:SQL的基础教程,可以使你在SQL的学习中轻松实现从0到1的过程,循序渐进地掌握SQL的基础知识和技巧.对于零基础来说非常友好,看完能够迅速上手SQL. 关于本文:一篇对这本书的知 ...

  5. SQL基础教程MICK版 ···第五章总结

    SQL基础教程MICK版 ···第五章总结 视图 子查询 标量子查询 标量子查询.没有用标量子查询.常量的比较总结 关联子查询 自己的困惑 视图 1.视图的概念 ​ 1)从SQL的角度来看视图就是一张 ...

  6. sql基础教程mysql_SQL基础教程(第2版)笔记整理

    花了一段时间把SQL基础教程(第2版)看完,并把笔记整理好. 数据定义语言(Data Define Language) 数据操作语言(Data Manipulation Language) 数据控制语 ...

  7. SQL基础教程|第一章:数据库和SQL

    前言: 1.本书在知识点提炼时侧重于实践效果,所以有些理论部分的知识点不会涉及或者几笔带过. 2.在语法实践时将会带入更多的例子和问题以便于理解数据库语法. 3.在所有关于SQL基础教程的文章中的语句 ...

  8. [读书笔记]《SQL基础教程》

    <sql基础教程>这本书里面讲的内容大部分都是几个主流数据库(mysql.sql server.oracle)之间的共同点,知识点比较基础,适合sql入门学习.但对于已经系统学过数据的人来 ...

  9. SQL基础教程MICK版 第一章总结

    SQL基础教程MICK版 ···第一章总结 数据库的结构 二维表 SQL操作大概的内容 要注意的规则 表的创建 表的删除与表定义的更新 表的数据键入 数据库的结构 最常见的系统结构就是 客户端\服务器 ...

最新文章

  1. java 枚举 循环_java – 在枚举中实现内部接口时的循环继承
  2. API接口通讯参数规范
  3. Vue.js之组件及其易错点
  4. Java 面试必备 | 7 个实验带你精通 JVM 性能调优!
  5. MyBatis关键配置-接口的扫描注册
  6. redis源码剖析(十一)—— Redis字符串相关函数实现
  7. 2019 Flutter 心愿单
  8. python人体识别_Github开源人体姿态识别项目OpenPose中文文档
  9. 蓝鸥iOS开发教程C语言——while语句
  10. python ndarray转binary_Python 实现Image和Ndarray互相转换
  11. 计算机应用基础选择题占多少分,计算机应用基础练习题(选择题部分)..doc
  12. 最基本的25道深度学习面试问题和答案
  13. python小玩意——敏感词汇检测
  14. 使用matlab的appdesigner绘制Steward并联机构
  15. 【23种设计模式】【单例模式】
  16. matlab进行复数计算
  17. 放鸡蛋问题:相同元素分配到相同的空间
  18. 这个“国宝级”景区,被誉为世界第八大奇迹,形成原因是个谜
  19. SpringBoot2——web开发(组件使用)
  20. 小程序二级分销系统一键生成开发

热门文章

  1. maven静态资源导出(Ctrl+C+V)
  2. matlab m语言,我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言...
  3. windows平台oracle无法调度,windows 2003+Legato networker+oracle 9i (框架)
  4. nginx http proxy 反向代理
  5. #地形剖面图_高中地理——每日讲1题(地形剖面图、河流水的补给、河流丁坝)...
  6. python中的列表是采用链式结构实现的_Python数据结构与算法之列表(链表,linked list)简单实现...
  7. python qcut_Python之Pandas库学习(三):数据处理
  8. Matlab 预防性维修,使用 MATLAB 进行预测性维护简介
  9. 不刷新页面的tab_SwiftUI小技巧之如何解决Tab切换后页面重置和List刷新bug
  10. springboot教程-web(二)