多表如何查詢?
【題目】
現在有兩個表,“學生表”記錄了學生的基本資訊,有“學號”、“姓名”。
“成績”表記錄了學生選修的課程,以及對應課程的成績。
這兩個表通過“學號”進行關聯。
現在要查找出所有學生的學號,姓名,課程和成績。
【解題思路】
1.確定查詢結果
題目要求查詢所有學生的姓名,學號,課程和成績資訊
select學號,姓名,課程,成績
查詢結果的列名“學號”、“姓名”,在“學生”表裡,列名“課程”、“成績”在“成績”表裡,所以需要進行多表查詢。
2.哪種聯結呢?
涉及到多表查詢,在之前的課程《從零學會sql:多表查詢》裡講過需要用到聯結。
多表的聯結又分為以下幾種型別:
1)左聯結(left join),聯結結果保留左表的全部資料
2)右聯結(right join),聯結結果保留右表的全部資料
3)內聯結(inner join),取兩表的公共資料
這個題目裡要求“所有學生”,而“所有學生”在“學生”表裡。為什麼不在“成績”表裡呢?
如果有的學生沒有選修課程,那麼他就不會出現在“成績”表裡,所以“成績”表沒有包含“所有學生”。
所以要以“學生”表進行左聯結,保留左邊表(學生表)裡的全部資料。
from 學生資訊表 as a left join 成績表 as b
3.兩個表聯結條件是什麼?
兩個表都有“學號”,所以聯結條件為學號。
on a.學號=b.學號
4.最終sql
select a.學號,a.姓名,b.課程,b.成績 from 學生 as a left join 成績 as b on a.學號=b.學號;
執行結果:我們看到學號4都課程為空值,表示這名學生沒有選修課程。
【本題考點】
考察多表聯結,以及如何選擇聯結的型別。記住課程裡講過的下面這張圖,遇到多表聯結的時候從這張圖選擇對於的sql。
【舉一反三】
有下面兩個表
編寫一個 SQL 查詢,滿足條件:無論 person 是否有地址資訊,都需要基於上述兩表提供person 的以下資訊:
FirstName, LastName, City, State
【思路】
從表的結構可以看出,表1(Person)是人的姓名資訊,表2(Address)是人的地址資訊。
1)查詢結果是兩個表裡的列名,所以需要多表查詢
2)考慮到有的人可能沒有地址資訊,要是查詢結構要查所有人,需要保留表1(Person)裡的全部資料,所以用左聯結(leftjoin)
3)兩個表聯結條件:兩個表通過personId產生聯結。
select FirstName, LastName, City, State from Person left join Address on Person.PersonId = Address.PersonId