SQL基础教程读书笔记-3
5 复杂查询
5.1 视图
1.表和视图的区别
表:保存的是实际的数据
视图:保存的是SELECT语句。从视图读取数据时,视图会在内部执行该SELECT语句并创建出一张临时表。
2.视图的优点
① 无需保存数据,因此可以节省存储设备的容量。
② 可以将频繁使用的SELECT语句保存成视图。
3.创建视图
CREATE VIEW 视图名称 (<视图列名1>,<视图列名2>,...)
AS <select语句 style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">;
CREATE VIEW ProductSum (product_type,cnt_product)
AS
SELECT product_type,COUNT(*) FROM Product
GROUP BY product_type;
4.删除视图
DROP VIEW 视图名称;
DROP VIEW ProductSum ;
5.多重视图
以视图为基础创建的视图;应避免使用,多重视图会降低SQL的性能。
6.视图的限制
①定义视图时不能使用ORDER BY子句
因为视图和表一样,数据行都是没有顺序的。
②对视图进行更新
必须满足一系列条件(既没有聚合又没有结合的SELECT子句),归根结底是对表的更新。
1)SELECT子句中未使用DISTINCT
2)FROM子句中只有一张表
3)未使用GROUP BY 子句
4)未使用HAVING 子句
5.2 子查询
子查询的特点概括起来就是一张一次性视图。
SELECT product_type,cnt_product
FROM
(SELECT product_type,COUNT(*) AS cnt_peoduct
FROM Product
GROUP BY product_type) AS ProductSum;
1.执行顺序
子查询作为内层查询会首先执行。
2.增加子查询的层数
子查询的层数原则上没有限制,但是,随着子查询嵌套层数的增加,SQL语句会变得越来越难读懂,性能也越来越差。因此,应避免使用多层嵌套的子查询。
3.子查询的名称
原则上子查询必须设定名称。
4.标量(单一)子查询:返回单一值的子查询
必须只能返回一行一列的结果
优点:标量子查询的返回值可以用=或<>这样需要单一值的比较运算符之中。
书写位置:能够使用常数或列名的地方,无论是SELECT子句,GROUP BY子句,HAVING子句,ORDER BY子句,几乎所有地方都可以使用。
--在WHERE子句中不能使用聚合函数
SELECT product_id,peoduct_name,sale_price
FROM Product
WHERE sale_price > AVG(sale_price);
筛选价格处于上游的商品时,看似上述Sql语句可以满足我们的需求,但是WHERE子句中不能使用聚合函数,因此这样的Sql语句是错误的;这个时候标量子查询就可以发挥它的功效了。
SELECT product_id,peoduct_name,sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product);
5.3 关联子查询
- 关联子查询会在细分的组内进行比较时使用
- 关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分
- 关联子查询的结合条件如果出现在子查询中就会发生错误
只通过语言描述可能难以理解,让我们看一下具体示例。按照商品种类与平均销售单价进行比较。
我们并不是要以全部商品为基础,而是要以细分的组为基础,对组内商品的平均价格和各商品的销售单价进行比较。
--发生错误的子查询
SELECT product_id,peoduct_name,sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product
GROUP BY product_type);
上述Sql出错的原因是因为该子查询会返回多行结果,并不是标量子查询。轮到关联子查询登场了。
SELECT product_id,peoduct_name,sale_price
FROM Product AS p1
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product p2
WHERE p1.product_type = p2.product_type
GROUP BY product_type);
这里起到关键作用的就是在子查询中添加的WHERE子句的条件,该条件的意思就是,在同一商品种类中对各商品的销售单价和平均单价进行比较。
组合条件一定要写在子查询中
--错误的关联子查询书写方式
SELECT product_id,peoduct_name,sale_price
FROM Product AS p1
WHERE p1.product_type = p2.product_type
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product p2
GROUP BY product_type);
该书写方式究竟违反了什么规则呢?
SQL基础教程读书笔记-3的更多相关文章
- SQL基础教程读书笔记-1
查询基础 2.2 算数运算符和比较运算符 2.2.1算数运算符 + - * / 需要注意NULL 5 + NULL 10 - NULL 1 * NULL 4 / NULL NULL / 9 NULL ...
- SQL基础教程读书笔记-2
4 数据更新 4.1数据的插入 1.清单{①列清单 ②值清单列清单和值清单的数量必须保持一致.原则上,执行一次INSERT语句会插入一行数据对表进行全列INSERT时,可以省略表名后的列清单2.插入默 ...
- SQL Server2012 T-SQL基础教程--读书笔记(1-4章)
SQL Server2012 T-SQL基础教程--读书笔记(1-4章) SqlServer T-SQL 示例数据库:点我 Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的 ...
- SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)
SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...
- SQL Server2012 T-SQL基础教程--读书笔记(5-7章)
SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5. ...
- 【索引】Objective-C基础教程-读书笔记
第1章 启程 http://www.cnblogs.com/duxiuxing/p/5492219.html 第2章 对C的扩展 第3章 面向对象编程的基础知识 第4章 继承 第5章 复合 第6章 ...
- 《Python基础教程读书笔记》
第1章 快速构造:基础知识 1.2交互式构造器 不强制分号,一行就是一行.可以加上分号 1.4数字和表达式 加.减.乘.除.整除.求余.指数.取反(-例如-2**2,**的优先级比-大) from _ ...
- 【Objective-C基础教程-读书笔记】第1章 启程
在第1章里面,作者主要以一种站在世界中心呼唤爱的姿态,给读者们打打鸡血洗洗脑,鼓励大家,投入时间学习Objective-C,值得啊! 首先,Objective-C既能用来开发OS X平台上的APP,又 ...
- Objective-C基础教程读书笔记(6)
第6章 源文件组织 到目前为止,我们讨论过的所有项目都是把源代码统统放入main.m文件中.类的main()函数,@interface和@implementation部分都被塞入同一个文件里.这种结构 ...
随机推荐
- display 的 32 种写法
从大的分类来讲, display的 32种写法可以分为 6个大类,再加上 1个全局类,一共是 7大类: 外部值 内部值 列表值 属性值 显示值 混合值 全局值 外部值 所谓外部值,就是说这些值只会直接 ...
- wss 协议传送过来的数据是经过 gzip 压缩过的,如何使用 qt 解压该数据呢?
#include <QtZlib/zlib.h> QByteArray qGzipUncompress(const QByteArray& data) { if (!data.da ...
- Windows 窗体中的事件顺序(WinForm)
引用MSDN,以便以后查看 引用:https://msdn.microsoft.com/zh-cn/library/86faxx0d.aspx 应用程序启动和关闭事件 Form 和 Control ...
- 在测试crontab执行脚本的时候,修改了linux的系统时间,crontab不执行了。
今天在写服务器的perl脚本的时候,在完成一版脚本打算通过crontab来测试一下呢,因为直接执行脚本文件是没有问题的,但是当配置到crontab定期执行时就会出现问题,到了指定的时间了,但是脚本文件 ...
- Spring Boot 2.0(三):Spring Boot 开源软件都有哪些?
2016年 Spring Boot 还没有被广泛使用,在网上查找相关开源软件的时候没有发现几个,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring ...
- bootstrap模态对话框
bootstrap模态对话框 前提是引入bootstrap的css和js的东西 data-backdrop="static"代表的是点击旁边的内容,不进行关闭操作,但是esc的时候 ...
- 浅谈this关键字
在我学习this关键字的时候,通过查找资料总结出一些this的特殊用法, 供大家参考,代码里面有我总结的分析过程! 箭头函数里的this: var username = "全局"; ...
- HighCharts之2D折线图
HighCharts之2D折线图 1.HighCharts之2D折线图源码 line.html: <!DOCTYPE html> <html> <head> < ...
- PL/SQL NOCOPY限制模式
NOCOPY模式用于限定OUT模式和IN OUT模式在调用时是不是以传引用的方式进行. 默认情况下,OUT模式和IN OUT模式的参数是以传值的方式进行调用的. IN模式总是以传引用的方式,如果用NO ...
- jQuery.isPlainObject()的作用
jQuery.isPlainObject()函数用于判断指定参数是否是一个纯粹的对象. 所谓"纯粹的对象",就是该对象是通过"{}"或"new Obj ...