SQL 語法 JOIN 介紹(inner join, left join, right join, full join)

範例資料表:

Department(部門)
    
Department: 
+--+----+
|Id|Name|
+--+----+
|1 |開發|
|2 |人資|
|3 |維運|
+--+----+
    

Employee(員工)
    
+--+----+------------+
|Id|Name|DepartmentId|
+--+----+------------+
|1 |美美 |1          |
|2 |大頭 |1          |
|3 |小明 |2          |
|4 |阿花 |null       |
+--+----+------------+
    

Department Id 3 的內容沒有被 Employee 的任何資料關聯,而 Employee Id 4 的資料也缺少 DepartmentId ,沒有對應的 Department。

INNER JOIN (合併查詢)

通常在語法中使用 JOIN 就是指 INNER JOIN ,意思是兩個表有交集的部分,語法可以使用 JOIN 或是 INNER JOIN 兩個都可以。
語法如下:
    
SELECT *
FROM Department
JOIN Employee ON Department.Id = Employee.DepartmentId;
    

上面有提到 Department Id 3 和 Employee Id 4 的資料都沒有和對方有關聯資料,所以這兩筆都不會顯示
    
+--+----+--+----+------------+
|Id|Name|Id|Name|DepartmentId|
+--+----+--+----+------------+
|1 |開發 |1 |美美|1           |
|1 |開發 |2 |大頭|1           |
|2 |人資 |3 |小明|2           |
+--+----+--+----+------------+
    

LEFT JOIN (左外部查詢)

這裡的 LEFT 並不是指 ON 後面的條件等於的左邊,而是指左表(主表),是指 FROM 條件後的第一個表:
    
SELECT *
FROM Department
LEFT JOIN Employee ON Department.Id = Employee.DepartmentId;
    

查詢後可以發現 Department 表沒有對應到的資料出現了,而 Employee 沒有對應到的資料還是沒有出現
    
+--+----+----+----+------------+
|Id|Name|Id  |Name|DepartmentId|
+--+----+----+----+------------+
|1 |開發 |1   |美美|1           |
|1 |開發 |2   |大頭|1           |
|2 |人資 |3   |小明|2           |
|3 |維運 |null|null|null        |
+--+----+----+----+------------+
    

RIGHT JOIN (右外部查詢)

RIGHT 就是語法中比較右側,JOIN 語法後面的那個表為主
    
SELECT *
FROM Department
RIGHT JOIN Employee ON Department.Id = Employee.DepartmentId;
    

這裡就可以看到換成 Employee 沒有關聯到的資料有出現了
    
+----+----+--+----+------------+
|Id  |Name|Id|Name|DepartmentId|
+----+----+--+----+------------+
|1   |開發 |1 |美美|1           |
|1   |開發 |2 |大頭|1           |
|2   |人資 |3 |小明|2           |
|null|null|4 |阿花|null        |
+----+----+--+----+------------+

    

FULL JOIN (全部外部查詢)

可以使用 FULL JOIN 或是 FULL OUTER JOIN ,兩個指令結果相同,都是取到兩張表的聯級
    
SELECT *
FROM Department
FULL JOIN Employee ON Department.Id = Employee.DepartmentId;
    

Department 和 Employee 所有資料都出現了,沒有的部分會填入 NULL
    
+----+----+----+----+------------+
|Id  |Name|Id  |Name|DepartmentId|
+----+----+----+----+------------+
|1   |開發|1   |美美|1           |
|1   |開發|2   |大頭|1           |
|2   |人資|3   |小明|2           |
|3   |維運|null|null|null        |
|null|null|4   |阿花|null        |
+----+----+----+----+------------+
    



參考資料:
Microsoft.Learn - Joins (SQL Server)

留言