這是一個系列文章,涵蓋了SQL最常用的知識點。題目來自于leetcode的sql題,文章列出了問題-完整解析-答案-知識點拓展-BAT等大廠面試真題。希望能幫你全方位的弄懂。有問題可以留言,碼字不易,寫一篇要好幾個小時,希望能得到點贊收藏哦。
一、問題
現有兩張表,一張名為”學生”表,包含學生編号,學生姓名,出生年月,性别。一張名為“成績”表,包含了學生選修的課程,以及對應課程的成績。 兩表通過“學号”進行關聯。
現在要求查出每一位學生的資訊,包括
學生編号,學生姓名,課程和成績資訊。二、資料準備
create
三、解答
【解題思路】
- 1.明确題目要求的結果
根據題幹要求的所有學生的資訊
姓名,學号,課程和成績資訊。我們知道:“學号”、“姓名”,儲存在“學生”表裡,“課程”、“成績”在“成績”表裡,是以需要進行多表查詢。
- 2.确定連接配接方式
注意題幹中的要求
所有的學生,有可能學生有注冊資訊但沒有課程成績資訊,是以以學生表作為主表。考察的知識點為表連接配接中的
外連接配接中的左連接配接或是右連接配接。
- 3.确定連接配接兩表的主鍵
兩個表都有“學生編号”,是以聯結條件為學生編号。
問:如果問題為查找有成績資訊的同學的資訊包括
學生編号,學生姓名,課程和成績資訊。改如何寫?
[代碼]
#
[本題解答]
有兩張表,編寫一個 SQL 查詢,滿足條件:無論 person 是否有位址資訊,都需要基于上述兩表提供 person 的以下資訊:
FirstName
【思路】
從題目看出,表1(Person)是人的姓名資訊,表2(Address)是人的位址資訊。
1)題目要求的結果是兩個表裡的資訊,是以需要多表查詢
2)有的人沒有位址資訊,是以要求查所有人就需要保留表1的全部資料,使用左連接配接
3)兩個表聯結條件:兩個表通過personId産生聯結。
【參考答案】
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId
四、基礎知識點
我們複習下基礎知識:表的連接配接方式有:
- 内連接配接 :被連接配接表中的所有列,包括其中的重複列。
- 外連接配接 : 左連接配接、右連接配接和全連接配接。
- 左連接配接:傳回左表中的所有行,如果左表中行在右表中沒有比對行,則結果中右表中的列傳回空值。
- 右連接配接:恰與左連接配接相反,傳回右表中的所有行,如果右表中行在左表中沒有比對行,則結果中左表中的列傳回空值。
- 全連接配接:傳回左表和右表中的所有行。當某行在另一表中沒有比對行,則另一表中的列傳回空值。
- 交叉連接配接 :也稱迪卡爾積。不帶WHERE條件子句,它将會傳回被連接配接的兩個表的笛卡爾積,傳回結果的行數等于兩個表行數的乘積,如果帶where,傳回或顯示的是比對的行數。
(注:圖中使用顔色表示兩表關聯)
五、大廠真題試練
螞蟻金服面試真題: sql中過濾條件放在on和where中的差別
我們知道on和where是篩選條件,那麼具體差別是什麼?我們分開看下。
- inner join: 結果沒有差別,前者是先求笛卡爾積然後按照on後面的條件進行過濾,後者是先用on後面的條件過濾,再用where的條件過濾。
- left join、right join:使用left join(right join)時on後面的條件隻對右表(左表)有效。
join過程可以這樣了解:where的執行順序在join之後,on執行在join之中。由于join要求索引列保留,是以對于left join來說on對右表生效。