T SQL基礎(三)之子查詢與表表示式

2022-01-12 07:39:01 字數 4554 閱讀 7859

在巢狀查詢中,最外面查詢結果集返回給呼叫方,稱為外部查詢。巢狀在外部查詢內的查詢稱為子查詢,子查詢的結果集供外部查詢使用

根據是否依賴外部查詢,可將子查詢分為自包含子查詢和相關子查詢。自包含子查詢不依賴外部查詢,相關子查詢則依賴外部查詢。

子查詢結果是在執行時計算的,查詢結果會跟隨查詢表的變化而改變。子查詢可以返回單個值(標量)、多個值或者整個表結果。

在邏輯上,子查詢**僅在外部查詢計算之前計算一次

自包含子查詢

use

wjchi;

​select

*from dbo.userinfo where age=

(

select

max(age) from

dbo.userinfo

);

相關子查詢

use

wjchi;

​select

*from dbo.userinfo as ui where identifyid =

(

select id from dbo.identify where id=

ui.identifyid

);

子查詢易錯點

null值處理不當

use

wjchi;

​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參與的比較預算結果均為unknownunknown參與的或運算結果依然為unknown

⚠️我們應時刻牢記sql是三值邏輯,這點很容易引發錯誤

列名處理不當

子查詢中的列名首先從當前查詢中進行解析,若未找到則到外部查詢中查詢。子查詢中很有可能無意中包含了外部查詢的列名導致子查詢有自包含子查詢變為相關子查詢而引發邏輯錯誤。

為避免上述錯誤,查詢中的列名盡可能使用完全限定名:[表名].[列名]

⚠️通常我們自己難以發現**中的邏輯錯誤,而我們的終端使用者嚐嚐扮演著問題發現者的角色
T SQL查詢高階 詳解公用表表示式 CTE

對於select查詢語句來說,通常情況下,為了使t sql 更加簡潔和可讀,在乙個查詢中引用另外的結果集都是通過檢視而不是子查詢來進行分解的.但是,檢視是作為系統物件存在資料庫中,那對於結果集僅僅需要在儲存過程或是使用者自定義函式中使用一次的時候,使用檢視就顯得有些奢侈了.公用表表示式 common...

T SQL查詢高階 詳解公用表表示式 CTE

對於select查詢語句來說,通常情況下,為了使t sql 更加簡潔和可讀,在乙個查詢中引用另外的結果集都是通過檢視而不是子查詢來進行分解的.但是,檢視是作為系統物件存在資料庫中,那對於結果集僅僅需要在儲存過程或是使用者自定義函式中使用一次的時候,使用檢視就顯得有些奢侈了.公用表表示式 common...

T SQL查詢高階 詳解公用表表示式 CTE

對於select查詢語句來說,通常情況下,為了使t sql 更加簡潔和可讀,在乙個查詢中引用另外的結果集都是通過檢視而不是子查詢來進行分解的.但是,檢視是作為系統物件存在資料庫中,那對於結果集僅僅需要在儲存過程或是使用者自定義函式中使用一次的時候,使用檢視就顯得有些奢侈了.公用表表示式 common...