文章出處

 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

  

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()