<LeetCode|資料庫>175.組合兩個表
表1: Person
±------------±--------+
| 列名 | 型別 |
±------------±--------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
±------------±--------+
PersonId 是上表主鍵
表2: Address
±------------±--------+
| 列名 | 型別 |
±------------±--------+
| AddressId | int |
| PersonId | int |
| City | 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的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。