你真的会玩SQL吗?无处不在的子查询
你真的会玩SQL吗?系列目录
你真的会玩SQL吗?之逻辑查询处理阶段
你真的会玩SQL吗?和平大使 内连接、外连接
你真的会玩SQL吗?三范式、数据完整性
你真的会玩SQL吗?查询指定节点及其所有父节点的方法
你真的会玩SQL吗?让人晕头转向的三值逻辑
你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?无处不在的子查询
你真的会玩SQL吗?Case也疯狂
你真的会玩SQL吗?表表达式,排名函数
你真的会玩SQL吗?简单的 数据修改
你真的会玩SQL吗?你所不知道的 数据聚合
你真的会玩SQL吗?透视转换的艺术
你真的会玩SQL吗?冷落的Top和Apply
你真的会玩SQL吗?实用函数方法汇总
你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)
你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(下)
子查询又称内部,而包含子查询的语句称之外部查询(又称主查询)。 所有的子查询可以分为两类,即相关子查询和非相关子查询 1>非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。 2>相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。 故非相关子查询比相关子查询效率高 --非相关子查询 SELECT EMPNO, LASTNAME FROM EMPLOYEE WHERE WORKDEPT = 'A00' AND SALARY > (SELECT AVG(SALARY) FROM EMPLOYEE WHERE WORKDEPT = 'A00') --相关子查询 SELECT E1.EMPNO, E1.LASTNAME, E1.WORKDEPT FROM EMPLOYEE E1 WHERE SALARY > (SELECT AVG(SALARY) FROM EMPLOYEE E2 WHERE E2.WORKDEPT = E1.WORKDEPT) ORDER BY E1.WORKDEPT
子查询
嵌套子查询,非相关子查询
相关子查询
自联接
联合查询
•Union 操作符:将两个或更多个 SELECT 语句的结果合并为一个结果集。
•联合可以指定为如下形式:
SELECT 语句 UNION [ALL] SELECT 语句
使用 ALL 子句表示不删除重复的行。
联合查询注意事项:
- 每个select必须具有相同的列结构
- 兼容列类型(指优先级较低数据类型必须能隐式地转换为较高级的数据类型)和相同数目的列
练习:
使用子查询
/*1:写一条查询语句,返回Orders表中活动的最后一天生成的所有订单。
涉及的表:Sales.Orders表。
期望的输出:*/
orderid orderdate custid empid
----------- ----------------------- ----------- -----------
11077 2008-05-06 00:00:00.000 65 1
11076 2008-05-06 00:00:00.000 9 4
11075 2008-05-06 00:00:00.000 68 8
11074 2008-05-06 00:00:00.000 73 7
参考SQL:
--answer:
select orderid,orderdate,custid,empid
from Sales.Orders
where orderdate in (
select max(orderdate) from Sales.Orders
)
/*
1.处理嵌套在外层查询语句里的子查询,应用max函数从表Sales.Orders中查找orderdate最后一天的日期,生成虚拟表VT1,
2.处理嵌套在外层的查询语句,从Sales.Orders表中查找满足where条件orderdate在虚拟表VT1中有相等值的数据,得到虚拟表VT2
3.处理select列表,从虚拟表VT2中查找出custid,orderdate,custid,empid返回虚拟表VT3
*/
/*2:写一条查询语句,并返回2008年5月1号(包括这一天)以后没有处理过的订单的雇员。
涉及到表:HR.Employees表和Sales.Orders表。
期望的输出:*/
empid FirstName lastname
----------- ---------- --------------------
3 Judy Lew
5 Sven Buck
6 Paul Suurs
9 Zoya Dolgopyatova
参考SQL:
--answer:
select empid,firstname,lastname
from HR.Employees
where empid not in(
select o.empid
from Sales.Orders as o
where o.orderdate>='2008-05-01'
)
/*
1.处理嵌套在外层查询语句里的子查询,表Sales.Orders别名o
2.查找满足where条件 o.orderdate>='2008-05-01',生成虚拟表VT1
3.从虚拟表VT1中处理select列表,查找出empid生成虚拟表VT2
4.处理嵌套在外层的查询语句,从Sales.Orders表中查找满足where条件empid不在虚拟表VT2中有相等值的数据,得到虚拟表VT3
5.处理select列表从虚拟表VT3中查找empid,firstname,lastname返回虚拟表VT4
*/
/*3:写一条查询语句,返回订购了第12号产品的客户。
涉及的表:Sales.Customers表和Sales.Orders表。
期望的输出:*/
custid companyname
----------------------------------------
48 Customer DVFMB
39 Customer GLLAG
71 Customer LCOUJ
65 Customer NYUHS
44 Customer OXFRU
51 Customer PVDZC
86 Customer SNXOJ
20 Customer THHDP
90 Customer XBBVR
46 Customer XPNIK
31 Customer YJCBX
87 Customer ZHYOS
参考SQL:
--answer:
SELECT custid, companyname
FROM Sales.Customers AS C
WHERE EXISTS
(SELECT *
FROM Sales.Orders AS O
WHERE O.custid = C.custid
AND EXISTS
(SELECT *
FROM Sales.OrderDetails AS OD
WHERE OD.orderid = O.orderid
AND OD.ProductID = 12));
/*
1.先处理外层查询,从Sales.Customers表别名C中取出一个元组,将元组相关列值custid传给内层查询
2.执行第一层内层查询,Sales.Orders表别名O中取出一个元组,将元组相关列值custid传给内层查询
3.执行第二层内层查询,Sales.Orders表别名OD应用where子句返回满足条件OD.orderid = O.orderid和 OD.ProductID = 12的值
4.返回到第一层内层查询中,应用where子句返回满足条件O.custid = C.custid和EXISTS条件的值
5.返回到外层查询处理 EXISTS,外查询根据子查询返回的结果集得到满足条件的行
*/
- 一个利用CVE-2017-11292的APT样本技术分析(一)
- Attribute(特性),怎么用才更好? —— 字段编号被误解了
- PDF.NET的SQL日志 ASP.net 路径问题 详解
- 【自然框架】稳定版beta1——源码下载,Demo说明
- TOP语句放到表值函数外,效率异常低下的原因分析
- 常见.NET功能代码汇总 (3) 33,彻底关闭Excel进程
- Vue.js 入门指南之“前传”(含sublime text 3 配置) 1,下载安装Node.js2,配置Vue环境3,Vue初探4,配置sublime Text
- JavaScript的“原型甘露”
- JSP开发过程遇到的中文乱码问题及解决方法
- 求连续操作(登录)数量(次数)最大的记录(用户)
- 使用Topshelf创建自宿主的Windows服务程序
- 如何用ORM支持SQL语句的CASE WHEN?
- 条件表达式的短路求值与函数的延迟求值
- 使用CTE解决复杂查询的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Codeforces 660C-Hard Process【尺取法练习】
- 杭电5178 (二分练习!)
- Java 13 新特性
- 杭电 1789(贪心思维练习)
- 利用反转函数确定回文串
- Codeforces Round #618 (Div. 2)
- Educational Codeforces Round 82 (Rated for Div. 2)
- [C# 开发技巧]如何防止程序多次运行
- 问题 1117: K-进制数
- Java 11 新垃圾回收器 ZGC
- Red and Black(DFS 深搜练习)
- Codeforces Round #619 (Div. 2)
- 问题 1255: [蓝桥杯][算法提高]能量项链
- C# 开发技巧]如何防止程序多次运行 线程 进程
- 问题 1433: [蓝桥杯][2013年第四届真题]危险系数