天天看點

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

              FROM EMPLOYEE E2

E2.WORKDEPT = E1.WORKDEPT)

    ORDER BY E1.WORKDEPT 

 子查詢

你真的會玩SQL嗎?無處不在的子查詢

嵌套子查詢,非相關子查詢   

相關例子 相關子查詢和嵌套子查詢 [SQL Server]

你真的會玩SQL嗎?無處不在的子查詢

相關子查詢

自聯接

你真的會玩SQL嗎?無處不在的子查詢
你真的會玩SQL嗎?無處不在的子查詢

聯合查詢

•Union 操作符:将兩個或更多個 SELECT 語句的結果合并為一個結果集。

•聯合可以指定為如下形式:

     SELECT 語句    UNION [ALL]           SELECT 語句

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

你真的會玩SQL嗎?無處不在的子查詢
 聯合查詢注意事項:

  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:

你真的會玩SQL嗎?無處不在的子查詢
你真的會玩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嗎?無處不在的子查詢
你真的會玩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嗎?無處不在的子查詢
你真的會玩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,外查詢根據子查詢傳回的結果集得到滿足條件的行
*/      

作者:歡醉

公衆号【一個碼農的日常】 技術群:319931204 1号群: 437802986 2号群: 340250479

出處:http://zhangs1986.cnblogs.com/

碼雲:https://gitee.com/huanzui

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

Top