SQL Joins

概覽

SQL Joins Overview

Inner Join

A、B 共同資料。

SELECT *
FROM A
INNER JOIN B ON A.KEY = B.KEY

Left Join

只要 A 部分資料(排除與 B 的交集)。

SELECT *
FROM A
LEFT JOIN B ON A.KEY = B.KEY
WHERE B.KEY IS NULL

Right Join

只要 B 部分資料(排除與 A 的交集)。

SELECT *
FROM A
RIGHT JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL

Full Outer Join

所有資料(A ∪ B)

SELECT *
FROM A
FULL OUTER JOIN B ON A.KEY = B.KEY

只有 A 或只有 B 的資料(排除交集)

SELECT *
FROM A
FULL OUTER JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL OR B.KEY IS NULL

Natural Join

自動以相同欄位名稱進行 JOIN,不需明確指定 ON 條件。

語法

SELECT *
FROM A
NATURAL JOIN B

範例

使用 employee 與 department 表(共同欄位:DEPARTMENT_ID):

SELECT e.FULL_NAME, d.DEPARTMENT_NAME
FROM employee e
NATURAL JOIN department d

Inner Join 等效寫法

SELECT e.FULL_NAME, d.DEPARTMENT_NAME
FROM employee e
INNER JOIN department d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
Natural Join 會自動匹配所有相同名稱的欄位,可能導致非預期的結果。建議明確使用 ON 條件。

Demo Tables

department table

DEPARTMENT_IDDEPARTMENT_NAME
1Executive
2HR
3Sales
4Development
5Support
6Research

employee table

EMPLOYEE_IDFULL_NAMEDEPARTMENT_IDROLEMANAGER_ID
1John Smith1CEO(null)
2Sarah Goodes1CFO1
3Wayne Ablett1CIO1
4Michelle Carey2HR Manager1
5Chris Matthews3Sales Manager2
6Andrew Judd4Development Manager3
7Danielle McLeod5Support Manager3
8Matthew Swan2HR Representative4
9Stephanie Richardson2Salesperson5
10Tony Grant3Salesperson5
11Jenna Lockett4Front-End Developer6
12Michael Dunstall4Back-End Developer6
13Jane Voss4Back-End Developer6
14Anthony Hird(null)Support7
15Natalie Rocca5Support7

location table

LOCATION_IDOFFICE_NAMECITYCOUNTRY
1HeadquartersNew YorkUSA
2Main OfficeLondonUK
3Sales OfficeTokyoJapan
4Development OfficeSan FranciscoUSA
5Support OfficeSydneyAustralia
6Research OfficeBerlinGermany

Join 3 Tables

多表關聯查詢,串接 employee、department 與 location 表。

情境

查詢員工姓名、所屬部門、及辦公室位置。

範例

SELECT
    e.FULL_NAME,
    e.ROLE,
    d.DEPARTMENT_NAME,
    l.OFFICE_NAME,
    l.CITY,
    l.COUNTRY
FROM employee e
INNER JOIN department d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
INNER JOIN location l ON d.DEPARTMENT_ID = l.LOCATION_ID

結果範例

FULL_NAMEROLEDEPARTMENT_NAMEOFFICE_NAMECITYCOUNTRY
John SmithCEOExecutiveHeadquartersNew YorkUSA
Sarah GoodesCFOExecutiveHeadquartersNew YorkUSA
Wayne AblettCIOExecutiveHeadquartersNew YorkUSA
Michelle CareyHR ManagerHRMain OfficeLondonUK
Matthew SwanHR RepresentativeHRMain OfficeLondonUK
Chris MatthewsSales ManagerSalesSales OfficeTokyoJapan
Tony GrantSalespersonSalesSales OfficeTokyoJapan

使用 LEFT JOIN

若要包含沒有部門或位置的員工:

SELECT
    e.FULL_NAME,
    e.ROLE,
    d.DEPARTMENT_NAME,
    l.OFFICE_NAME
FROM employee e
LEFT JOIN department d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
LEFT JOIN location l ON d.DEPARTMENT_ID = l.LOCATION_ID
使用 LEFT JOIN 時,沒有匹配的欄位會顯示 NULL。例如 Anthony Hird 的 DEPARTMENT_ID 為 NULL,因此 DEPARTMENT_NAME 和 OFFICE_NAME 都會是 NULL。

相關主題