在巢狀查詢中,最外面查詢結果集返回給呼叫方,稱為外部查詢。巢狀在外部查詢內的查詢稱為子查詢,子查詢的結果集供外部查詢使用。
根據是否依賴外部查詢,可將子查詢分為自包含子查詢和相關子查詢。自包含子查詢不依賴外部查詢,相關子查詢則依賴外部查詢。
子查詢結果是在執行時計算的,查詢結果會跟隨查詢表的變化而改變。子查詢可以返回單個值(標量)、多個值或者整個表結果。
在邏輯上,子查詢**僅在外部查詢計算之前計算一次。
自包含子查詢
usewjchi;
select
*from dbo.userinfo where age=
(
select
max(age) from
dbo.userinfo
);
相關子查詢
usewjchi;
select
*from dbo.userinfo as ui where identifyid =
(
select id from dbo.identify where id=
ui.identifyid
);
子查詢易錯點
null值處理不當
usewjchi;
select
*from
dbo.customers
where custid notin(
select
top10 c.custid from dbo.customers as c order
byc.custid
);
上述查詢語句看起來可以正常執行,但當子查詢的返回結果集中包含null值時,上述查詢語句則不會返回任何資料。解釋如下:
20 not in(10, 9, 8, null)
等價於not(20=10 or 20=9 or 20=8 or 20=null)
,null
參與的比較預算結果均為unknown
,unknown
參與的或運算結果依然為unknown
。
⚠️我們應時刻牢記sql是三值邏輯,這點很容易引發錯誤列名處理不當
子查詢中的列名首先從當前查詢中進行解析,若未找到則到外部查詢中查詢。子查詢中很有可能無意中包含了外部查詢的列名導致子查詢有自包含子查詢變為相關子查詢而引發邏輯錯誤。
為避免上述錯誤,查詢中的列名盡可能使用完全限定名:[表名].[列名]
。
⚠️通常我們自己難以發現**中的邏輯錯誤,而我們的終端使用者嚐嚐扮演著問題發現者的角色T SQL查詢高階 詳解公用表表示式 CTE
對於select查詢語句來說,通常情況下,為了使t sql 更加簡潔和可讀,在乙個查詢中引用另外的結果集都是通過檢視而不是子查詢來進行分解的.但是,檢視是作為系統物件存在資料庫中,那對於結果集僅僅需要在儲存過程或是使用者自定義函式中使用一次的時候,使用檢視就顯得有些奢侈了.公用表表示式 common...
T SQL查詢高階 詳解公用表表示式 CTE
對於select查詢語句來說,通常情況下,為了使t sql 更加簡潔和可讀,在乙個查詢中引用另外的結果集都是通過檢視而不是子查詢來進行分解的.但是,檢視是作為系統物件存在資料庫中,那對於結果集僅僅需要在儲存過程或是使用者自定義函式中使用一次的時候,使用檢視就顯得有些奢侈了.公用表表示式 common...
T SQL查詢高階 詳解公用表表示式 CTE
對於select查詢語句來說,通常情況下,為了使t sql 更加簡潔和可讀,在乙個查詢中引用另外的結果集都是通過檢視而不是子查詢來進行分解的.但是,檢視是作為系統物件存在資料庫中,那對於結果集僅僅需要在儲存過程或是使用者自定義函式中使用一次的時候,使用檢視就顯得有些奢侈了.公用表表示式 common...