1. 程式人生 > 資料庫 ><LeetCode|資料庫>175.組合兩個表

<LeetCode|資料庫>175.組合兩個表

表1: Person

±------------±--------+
| 列名 | 型別 |
±------------±--------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
±------------±--------+
PersonId 是上表主鍵
表2: Address

±------------±--------+
| 列名 | 型別 |
±------------±--------+
| AddressId | int |
| PersonId | int |
| City | varchar |

| State | varchar |
±------------±--------+
AddressId 是上表主鍵

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

FirstName, LastName, City, State

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/combine-two-tables
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

重點在Person表可能為空
我一開始寫的程式碼就無法查出不具有地址的person。檢視題解後,程式碼為:

# Write your MySQL query statement below
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId

重點有兩個:
1.SQL中連線的區別
2.from和on的區別

一、SQL中的連線
1.關係代數中關於連線的部分

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
2.連線的MySQL實現
內連線(inner join):預設,使用where子句即可

select ...
from A,B
where 條件

外連線(outer join):需要在from子句中標明

左外連線:

select ...
from A left join B
on 條件

右外連線:

select ...
from A right join B
on 條件

二、from和on的區別
(以下解釋來自LeetCode該題的精選評論)
資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。 在使用left jion時,on和where條件的區別如下:
1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄
2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉