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部分都被塞入同一个文件里.这种结构 ...
随机推荐
- vs code 使用git
1.下载git https://git-scm.com/ 2. git 全局设置 git config --global user.name "xxxx" git config - ...
- .NET平台开源项目速览(19)Power BI神器DAX Studio
PowerBI更新频繁,已经有点更不上的节奏,一直在关注和学习中,基本的一些操作大概是没问题,更重要的是注重Power Query,M函数,以及DAX的使用,这才是核心. 上个月研究了DAX的一些 ...
- thinkPHP替换SQL变量
使用tp里M()->where(pb_id=%d and course=%d and DATE_FORMAT(pub_time, \"%H:%i:%s\") < &qu ...
- iptables转发备忘
iptables -F sysctl net.ipv4.ip_forward=1 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8766 - ...
- PHP调用外部命令
------------------------------------------------------------------ 一.PHP调用外部命令总结 ...
- Mysql引擎中MyISAM和InnoDB的区别有哪些?
简单的概括一下 InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和 ...
- uva 1151最小生成树
先求一次最小生成树,可以排除n*(n*1)/2-(n-1)条边,每次利用二进制法枚举套餐的选择,套餐中的点直接处理,如果两个套餐有公共点直接合并,他们一定连通,然后枚举第一步最小生成树得到的n-1条边 ...
- php面试上机题(2018-3-3)
需求:将第三方api的前3000条数据全部读取出来,存入对应的数据库字段 第三方api:http://pub.cloudmob.mobi/publisherapi/offers/?uid=92& ...
- 【java学习笔记】序列化、反序列化
序列化 是将对象的完整信息保存起来的过程(持久化). 序列化流:ObjectOutputStream 反序列化 是将对象进行还原的过程(反持久化). 反序列化流:Ob ...
- Git & github 使用指南
Git的安装: 1.下载 Git for windows下载网址:https://git-for-windows.github.io/ 2.安装 选择安装路径: 选择组件:默认 是否修改环境变量 : ...