你真的会玩SQL吗?无处不在的子查询

简介:    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节点的方法 你真的会玩SQL吗?让人晕头转向的三值逻辑 你真的会玩SQL吗?EXI...

  

你真的会玩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 
 

 子查询

 

 

嵌套子查询,非相关子查询   

相关例子 相关子查询和嵌套子查询 [SQL Server]

 

相关子查询

 

自联接

联合查询

•Union 操作符:将两个或更多个 SELECT 语句的结果合并为一个结果集。
•联合可以指定为如下形式:

     SELECT 语句    UNION [ALL]           SELECT 语句

使用 ALL 子句表示不删除重复的行

 联合查询注意事项:

  1. 每个select必须具有相同的列结构
  2. 兼容列类型(指优先级较低数据类型必须能隐式地转换为较高级的数据类型)和相同数目的列

 

练习:

使用子查询

/*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
*/
View Code
/*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
*/
View Code
/*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,外查询根据子查询返回的结果集得到满足条件的行
*/
View Code

 

目录
相关文章
|
3月前
|
SQL 数据库 开发者
SQL中的子查询:嵌套查询的深度解析
【8月更文挑战第31天】
367 0
|
SQL 数据处理 数据库
如何理解SQL中的自连接?
说起自连接,想必小伙伴们都听说过。在进行数据处理时经常会使用到自连接,特别是像一些连续性的问题中使用的比较多。
如何理解SQL中的自连接?
|
SQL 关系型数据库 MySQL
来自灵魂的拷问——知道什么是SQL执行计划吗?(2)
来自灵魂的拷问——知道什么是SQL执行计划吗?
174 0
来自灵魂的拷问——知道什么是SQL执行计划吗?(2)
|
SQL 缓存 关系型数据库
来自灵魂的拷问——知道什么是SQL执行计划吗?(1)
来自灵魂的拷问——知道什么是SQL执行计划吗?
224 0
来自灵魂的拷问——知道什么是SQL执行计划吗?(1)
|
存储 SQL 大数据
大数据SQL中的Join谓词下推,真的那么难懂?
个人认为谓词下推有两个层面的理解:其一是逻辑执行计划优化层面的说法,比如SQL语句:select * from order ,item where item.id = order.item_id and item.category = ‘book’,正常情况语法解析之后应该是先执行Join操作,再执行Filter操作。通过谓词下推,可以将Filter操作下推到Join操作之前执行。即将where item.category = ‘book’下推到 item.id = order.item_id之前先行执行。 其二是真正实现层面的说法,谓词下推是将过滤条件从计算进程下推到存储进程先行执行。
637 0
大数据SQL中的Join谓词下推,真的那么难懂?
|
SQL 数据库管理 索引
SQL 子查询怎么优化?写的很深!
子查询 (Subquery)的优化一直以来都是 SQL 查询优化中的难点之一。关联子查询的基本执行方式类似于 Nested-Loop,但是这种执行方式的效率常常低到难以忍受。当数据量稍大时,必须在优化器中对其进行去关联
SQL 子查询怎么优化?写的很深!
|
SQL Oracle Cloud Native
一文详解SQL关联子查询
本文主要介绍什么是关联子查询以及如何将关联子查询改写为普通语义的sql查询。
2014 0
一文详解SQL关联子查询
|
SQL 存储
sql联合查询语句总结
sql联合查询语句总结 首先假设有两个表,表A和表B A表中包含(id name sex phone ) B表中包含(ID name adress phone) 内敛查询:内敛查询的作用是只允许生成可以同时匹配的的表A和表B的集合,然后交叉形成的的公共部分,注意他们只有一小部分是重合的; 例句:.
1717 0
|
SQL
sql表连接的几种方式
这里有两张表TableA和TableB,分别是姓名表和年龄表,用于我们例子的测试数据 TableA id name 1 t1 2 t2 4 t4 TableB id age ...
1022 0
|
SQL 索引 数据库
SQL|索引的力量
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。 索引 您可以在表中创建索引,以便更加快速高效地查询数据。 用户无法看到索引,它们只能被用来加速搜索/查询。
1002 0