SQLServer子查詢可以分為 相關子查詢 和 嵌套子查詢
假設有如下Book表:
一:相關子查詢的執行依賴于外部查詢。多數情況下是子查詢的Where子句中引用了外部查詢的表。執行步驟:
(1)從外層查詢中取出一個元組,將元組相關列的值傳給內層查詢。
(2)執行內層查詢,得到子查詢操作的值。
(3)外查詢根據子查詢返回的結果或結果集得到滿足條件的行。
(4)然后外層查詢取出下一個元組重復做步驟1-3,直到外層的元組全部處理完畢。
eg:
查詢Book表中大于該類圖書價格平均值的圖書信息:
SElECT 圖書名,出版社,類編號,價格 FROM Books As a WHERE 價格 > ( SELECT AVG(價格) FROM Books AS b WHERE a.類編號=b.類編號 ) GO
相關子查詢無法獨立于外部查詢而得到解決。該子查詢需要一個“類編號”的值。而這個值是個變量,隨SQLServer檢索Book表中的不同行而改變。下面詳細說明該查詢執行過程:
先將Book表中的第一條記錄的“類編號”的值“2”代入子查詢中,子查詢變為:
SELECT AVG(價格) FROM Books AS WHERE b.類編號=2
子查詢的結果為該類圖書的平均價格,所以外部查詢變為:
SElECT 圖書名,出版社,類編號,價格 FROM Books As a WHERE 價格 > 34
如果Where條件為True,則第一條結果包括在結果集中,則否不包括。對Book表中的所有行運行相同的過程,最后形成的結果集及最后返回結果。
二:嵌套子查詢的執行不依賴與外部的查詢。執行步驟:
(1)執行子查詢,其結果不被顯示,而是傳遞給外部查詢,作為外部查詢的條件使用。
(2)執行外部查詢,并顯示整個結果。
嵌套子查詢一般可以分為:返回單值的子查詢 和 返回一個列表的子查詢
eg:
1.返回單值:
查詢所有價格高于平均價格的圖書名,作者,出版社和價格。
USE tempdb GO SElECT 圖書名,作者,出版社,價格 FROM Books WHERE 價格 > ( SELECT AVG(價格) FROM Books ) GO
2.返回值列表
查詢所有借閱圖書的讀者信息
SElECT * FROM Readers WHERE 讀者編號 IN ( SELECT 讀者編號 FROM [Borrow History] ) GO
三:兩種分頁的方法:
分頁目的:為了加快網站對數據的查詢(檢索)速度。
方法一:(核心思想) 跳過幾條取幾條。(雙top 雙order by )
select top 3 * from student where studentno not in ( select top 3 studentno from student order by studentno ) order by studentno
方法二:(局限性)(SQL Server2005之后的版本支持該寫法,因為要用到row_number() over()函數,在之前是沒有該函數)
select * from Student select * from( select *,ROW_NUMBER()over(order by StudentNo) as myid from Student ) as temp where myid between 4 and 6
文章列表