大家好,我是寧一。
今天講解SQL教程第18課:子查詢。
基本語法:
SELECT FROM WHERE( SELECT FROM );
我們一般稱外面嵌套的語句為主查詢,里面被嵌套的語句為子查詢,有時也會叫外查詢、內(nèi)查詢,大家知道意思就好。
子查詢要用括號括起來。子查詢不僅可以放在WHERE的后面,還可以放在SELECT、FROM的后面,我們一個個來講解。
1、子查詢+WHERE子句
SQL執(zhí)行時,會先執(zhí)行括號內(nèi)的子查詢,子查詢最常與WHERE子句結(jié)合使用。子查詢的結(jié)果作為WHERE子句的篩選條件,完成更復(fù)雜的數(shù)據(jù)檢索。
實例:在Students表中,找出所有在”寧一”后面出生的學(xué)生。
實例解析:需要先確定”寧一”的生日,再將生日作為WHERE篩選條件,得到最終數(shù)據(jù)。
第一步:找到”寧一”的生日
SELECT SageFROM StudentsWHERE Sname = “寧一”
第二步:將生日作為WHERE篩選條件,得到最終數(shù)據(jù),子查詢語句要用括號括起來。
SELECT *FROM StudentsWHERE Sage > ( SELECT Sage FROM Students WHERE Sname = “寧一”)
2、子查詢 + SELECT 語句
子查詢還可以與 SELECT 語句結(jié)合使用,子查詢返回的結(jié)果,會作為列顯示在結(jié)果集中。
SELECT語句的子查詢經(jīng)常與聚合函數(shù)結(jié)合使用。因為我們使用聚合函數(shù)的時候,記錄會合成一條,其它數(shù)據(jù)細節(jié)就不能顯示了。
比如:我們想要查看學(xué)生表中所有的學(xué)生姓名、學(xué)生生日、學(xué)生的最大生日。
示例結(jié)果:
錯誤寫法:
SELECT Sname,Sage,Max(Sage)FROM Students
像上面這樣寫是會報錯的,因為聚合函數(shù)與其他表中的列(Sname,Sage),同時放在SELECT的后面。需要用GROUP BY語句將這些表中的列(Sname,Sage)分組。
上面的語句后面加上 GROUP BY Sname,Sage 就可以了。
但是這樣寫,會將每組的數(shù)據(jù)聚合成1條數(shù)據(jù),比如每組有3條數(shù)據(jù),使用聚合函數(shù)MAX()+GROUP BY,最終每組只會顯示1條最大值的數(shù)據(jù)。
我們需要展現(xiàn)Students表中所有的學(xué)生,這樣寫不能滿足我們的需求。
正確寫法:結(jié)合子查詢來實現(xiàn)。
SELECT Sname, Sage, (SELECT Max(Sage) FROM Students) AS MaxageFROM Students
3、子查詢+FROM子句
子查詢與FROM子句結(jié)合使用,子查詢結(jié)果被當成了一個“表”,可以用SELECT語句做進一步的篩查。
比如:我們先寫一個SELECT查詢語句
SELECT Sid, ‘student’ AS statusFROM StudentsWHERE Sid <= 5
將上面的查詢語句放在FROM的后面,則上面查詢到的結(jié)果,就會被當成一個“表”。
SELECT Sid,statusFROM ( SELECT Sid, ‘student’ AS status FROM Students WHERE Sid 2
這里有一個特別要注意的地方,放在FROM后面的子查詢,必須要加別名。
復(fù)雜的子查詢再嵌套進 FROM 里會讓整個查詢看起來過于復(fù)雜,我們一般會將子查詢結(jié)果儲存為視圖,然后再直接使用視圖作為來源表,視圖會SQL高階課程中詳細講解。
其實子查詢就是查詢語句嵌套,沒有什么新的東西,只是多了一個層級,由內(nèi)向外地一層層梳理就會很清楚了。
作業(yè):結(jié)合Students表,從Teachers表中找出當班主任的老師(通過子查詢實現(xiàn))。
作業(yè)解析:先從Students表中,找出所有班主任的Tid并去重,將查詢結(jié)果作為篩選條件,放在WHERE語句中。
SELECT *FROM TeachersWHERE Tid IN ( SELECT DISTINCT Tid FROM Students)
點擊關(guān)注,更新課程第一時間通知哦~