子查詢概念:把一個查詢的結果在另一個查詢中使用就叫做子查詢
1.子查詢作為條件時
當我們使用子查詢作為條件時,若子查詢返回值為多個,則會報以下錯誤:
"子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之后,或子查詢用作表達式時,這種情況是不允許的。"
此時我們應該使用范圍【in】關鍵字來解決。
2.子查詢的分類
a.獨立子查詢:可以獨立來執行的查詢語句做子查詢使用
b.相關子查詢:子查詢使用了父查詢中的列
3.子查詢的使用方式
a.子查詢作為條件使用:當父查詢需要某個值,就可以用子查詢給出。
b.子查詢作為列的值
select ClassName from MyClass where ClassId=1 select StudentName,Gender,(select ClassName from MyClass where ClassId=1) from Student where ClassId=1
我們使用第一行代碼作為列值,現在代碼為正確的寫法,但會有其他兩種出錯的寫法。
i.
select StudentName,Gender,(select ClassName from MyClass) from Student where ClassId=1
由於沒有寫限定條件,子查詢將返回一列多行多個值,會有如下報錯:
j.
select StudentName,Gender,(select * from MyClass) from Student where ClassId=1
由於*代表了一行多列值,會有以下報錯:
c.子查詢作為結果集
i.
使用子查詢結果集實現分頁:
select top 3 *from Student--第一頁 select top 3*from Student where StudentId not in(select top 3 StudentId from Student)--第二頁
在這里我們先選擇了第一頁,一共三條數據,然后使用第一頁的結果集作為第二頁的查詢條件,得出第二頁不在這三條結果范圍外的前三條結果。
j.
我們還可以使用ROW_NUMBER來實現分頁效果,此函數為數據集提供一個連續的編號,我們用這些編號來實現分頁。
select *,ROW_NUMBER()over(order by studentid) as id from Student select *from(select *,ROW_NUMBER()over(order by studentid) as id from Student) as temp where id>0 and id<=5 select *from(select *,ROW_NUMBER()over(order by studentid) as id from Student) as temp where id>5 and id<=10