SQL之子查詢


子查詢概念:把一個查詢的結果在另一個查詢中使用就叫做子查詢

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM