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部分都被塞入同一个文件里.这种结构 ...
随机推荐
- Dockerfile 中的 CMD 与 ENTRYPOINT
CMD 和 ENTRYPOINT 指令都是用来指定容器启动时运行的命令.单从功能上来看,这两个命令几乎是重复的.单独使用其中的一个就可以实现绝大多数的用例.但是既然 doker 同时提供了它们,为了在 ...
- pinvoke 数据交互笔记
intptr to array string string[] _outputStrArray=null; int channelCount = 0;///返回数组大小 In ...
- 插入排序实现&&选择排序实现
萌新刚刚开始学习算法,第一步是学习排序,毕竟算法的四大块"排序,查找,图,字符串"里面,排序是第一位的(PS:今天才知道算法提供的只是一个程序编写思路,一直以为是一个函数,难怪传入 ...
- C/C++语言的特点
一.支持数据封装和数据隐藏 在C++中,类是支持数据封装的工具,对象则是数据封装的实现.C++通过建立用户定义类支持数据封装和数据隐藏. 在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装 ...
- maven中的传递依赖和传递依赖的解除
例如创建三个maven工程A B C pom文件分别为 A <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...
- 业余草分享 Spring Boot 2.0 正式发布的新特性
就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...
- 《android开发艺术探索》读书笔记(十三)--综合技术
接上篇<android开发艺术探索>读书笔记(十二)--Bitmap的加载和Cache No1: 使用CrashHandler来获取应用的crash信息 No2: 在Android中单个d ...
- ZOJ - 3261 逆向并查集
思路:很巧妙的解法.如果按照常规一边读入,一边合并并查集,删边实在没办法做. 首先读入所有的操作,把所有不会被删除的边加入并查集,然后从最后一个操作开始逆向操作,当遇到删边操作,就直接把这条边加入并查 ...
- 浅谈CDN、SEO、XSS、CSRF
CDN 什么是CDN 初学Web开发的时候,多多少少都会听过这个名词->CDN. CDN在我没接触之前,它给我的印象是用来优化网络请求的,我第一次用到CDN的时候是在找JS文件时.当时找不到相对 ...
- java读取数据写入txt文件并将读取txt文件写入另外一个表
package com.xsw.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.F ...