天天看點

leftjoin多表聯合查詢_leetcode-sql練習精講系列文章——一、多表如何連接配接

leftjoin多表聯合查詢_leetcode-sql練習精講系列文章——一、多表如何連接配接

這是一個系列文章,涵蓋了SQL最常用的知識點。題目來自于leetcode的sql題,文章列出了問題-完整解析-答案-知識點拓展-BAT等大廠面試真題。希望能幫你全方位的弄懂。有問題可以留言,碼字不易,寫一篇要好幾個小時,希望能得到點贊收藏哦。

一、問題

現有兩張表,一張名為”學生”表,包含學生編号,學生姓名,出生年月,性别。一張名為“成績”表,包含了學生選修的課程,以及對應課程的成績。 兩表通過“學号”進行關聯。

現在要求查出每一位學生的資訊,包括

學生編号,學生姓名,課程和成績資訊。

二、資料準備

create 
           
leftjoin多表聯合查詢_leetcode-sql練習精講系列文章——一、多表如何連接配接

三、解答

【解題思路】

  • 1.明确題目要求的結果

根據題幹要求的所有學生的資訊

姓名,學号,課程和成績資訊

。我們知道:“學号”、“姓名”,儲存在“學生”表裡,“課程”、“成績”在“成績”表裡,是以需要進行多表查詢。

  • 2.确定連接配接方式

注意題幹中的要求

所有的學生

,有可能學生有注冊資訊但沒有課程成績資訊,是以以學生表作為主表。考察的知識點為表連接配接中的

外連接配接中的左連接配接或是右連接配接

  • 3.确定連接配接兩表的主鍵

兩個表都有“學生編号”,是以聯結條件為學生編号。

問:如果問題為查找有成績資訊的同學的資訊包括

學生編号,學生姓名,課程和成績資訊。

改如何寫?

[代碼]

#
           
leftjoin多表聯合查詢_leetcode-sql練習精講系列文章——一、多表如何連接配接

[本題解答]

有兩張表,編寫一個 SQL 查詢,滿足條件:無論 person 是否有位址資訊,都需要基于上述兩表提供 person 的以下資訊:

FirstName
           
leftjoin多表聯合查詢_leetcode-sql練習精講系列文章——一、多表如何連接配接

【思路】

從題目看出,表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,傳回或顯示的是比對的行數。
leftjoin多表聯合查詢_leetcode-sql練習精講系列文章——一、多表如何連接配接

​ (注:圖中使用顔色表示兩表關聯)

五、大廠真題試練

螞蟻金服面試真題: 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對右表生效。