1. 程式人生 > 實用技巧 >多表如何查詢?

多表如何查詢?

【題目】

現在有兩個表,“學生表”記錄了學生的基本資訊,有“學號”、“姓名”。

“成績”表記錄了學生選修的課程,以及對應課程的成績。

這兩個表通過“學號”進行關聯。

現在要查找出所有學生的學號,姓名,課程和成績。

【解題思路】

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