左外連線
左外連線(也稱為左連線或外連線)是一個連線,可確保左表中的所有行都被表示; 如果右表中沒有匹配的行,則其對應的欄位為 NULL
。
以下示例將選擇所有部門以及在該部門中工作的員工的名字。沒有員工的部門仍會在結果中返回,但員工姓名將為 NULL:
SELECT Departments.Name, Employees.FName
FROM Departments
LEFT OUTER JOIN Employees
ON Departments.Id = Employees.DepartmentId
這將從示例資料庫返回以下內容 :
Departments.Name | Employees.FName |
---|---|
HR |
詹姆士 |
HR |
約翰 |
HR |
喬納森 |
銷售 | 邁克爾 |
技術 | 空值 |
那怎麼辦?
FROM 子句中有兩個表:
ID |
FName 引數 | LName | 電話號碼 | 經理 ID | DepartmentID | 薪水 | 聘用日期 |
---|---|---|---|---|---|---|---|
1 |
詹姆士 | 工匠 | 1234567890 | 空值 | 1 | 1000 | 2002 年 1 月 1 日 |
2 |
約翰 | 約翰遜 | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
3 |
邁克爾 | 威廉姆斯 | 1357911131 | 1 | 2 | 600 | 12-05-2009 |
4 |
喬納森 | 工匠 | 1212121212 | 2 | 1 | 500 | 24-07-2016 |
和
ID |
名稱 |
---|---|
1 |
HR |
2 |
銷售 |
3 |
技術 |
首先,從兩個表中建立一個笛卡爾積,給出一箇中間表。
符合連線條件的記錄( Departments.Id = Employees.DepartmentId )以粗體突出顯示; 這些被傳遞到查詢的下一個階段。
由於這是 LEFT OUTER JOIN,所有記錄都從連線的 LEFT 側返回(Departments),而如果 RIGHT 側的任何記錄與連線標準不匹配,則會給出 NULL 標記。在下表中,這將返回帶有 NULL
的 Tech
ID |
名稱 | ID | FName 引數 | LName | 電話號碼 | 經理 ID | DepartmentID | 薪水 | 聘用日期 |
---|---|---|---|---|---|---|---|---|---|
1 | HR | 1 | 詹姆士 | 工匠 | 1234567890 | 空值 | 1 | 1000 | 2002 年 1 月 1 日 |
1 | HR | 2 | 約翰 | 約翰遜 | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
1 |
HR | 3 | 邁克爾 | 威廉姆斯 | 1357911131 | 1 | 2 | 600 | 12-05-2009 |
1 | HR | 4 | 喬納森 | 工匠 | 1212121212 | 2 | 1 | 500 | 24-07-2016 |
2 |
銷售 | 1 | 詹姆士 | 工匠 | 1234567890 | 空值 | 1 | 1000 | 2002 年 1 月 1 日 |
2 |
銷售 | 2 | 約翰 | 約翰遜 | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
2 | 銷售 | 3 | 邁克爾 | 威廉姆斯 | 1357911131 | 1 | 2 | 600 | 12-05-2009 |
2 |
銷售 | 4 | 喬納森 | 工匠 | 1212121212 | 2 | 1 | 500 | 24-07-2016 |
3 |
技術 | 1 | 詹姆士 | 工匠 | 1234567890 | 空值 | 1 | 1000 | 2002 年 1 月 1 日 |
3 |
技術 | 2 | 約翰 | 約翰遜 | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
3 |
技術 | 3 | 邁克爾 | 威廉姆斯 | 1357911131 | 1 | 2 | 600 | 12-05-2009 |
3 |
技術 | 4 | 喬納森 | 工匠 | 1212121212 | 2 | 1 | 500 | 24-07-2016 |
最後,評估 SELECT 子句中使用的每個表示式以返回我們的最終表:
Departments.Name | Employees.FName |
---|---|
HR |
詹姆士 |
HR |
約翰 |
銷售 | 理查德 |
技術 | 空值 |