摘要:在本教程中,您將學習如何使用 SQL 自連線技術來比較同一表中的行。
SQL 自連線簡介 #
通常,您使用內連線 (inner join)、左連線 (left join) 和 右連線 (right join) 等連線操作來根據某個條件合併兩個表中的行。
然而,連線並不一定涉及多個表。您可以使用連線來比較同一表中的行。在這種情況下,您將一個表連線到它自身,這就形成了自連線。
自連線是一種比較同一表內行的連線。自連線使用內連線、左連線或右連線將一個表連線到其自身。它使用表別名將同一個表在同一個查詢中視為不同的表。
以下是自連線的基本語法:
SELECT
select_list
FROM
table1 t1
INNER JOIN table1 AS t2 ON t1.column1 = t2.column2;Code language: SQL (Structured Query Language) (sql)在此語法中,您可以使用 LEFT JOIN、RIGHT JOIN 和 FULL JOIN 來代替 INNER JOIN。
SQL 自連線示例 #
我們將使用 HR 示例資料庫中的 employees 表。

在 employees 表中:
employee_id作為每位員工的唯一識別符號。manager_id代表當前員工彙報物件的經理的employee_id。如果manager_id為NULL,則表示該員工是 CEO,沒有經理。
以下查詢使用內連線將 employees 表連線到自身,以獲取誰向誰彙報的資訊:
SELECT
e.first_name employee,
m.first_name manager
FROM
employees e
LEFT JOIN employees m ON m.employee_id = e.manager_id
ORDER BY
manager NULLS FIRST;Code language: SQL (Structured Query Language) (sql)輸出
employee | manager
-------------+-----------
Valli | Alexander
Diana | Alexander
Bruce | Alexander
David | Alexander
Guy | Den
Karen | Den
Alexander | Den
Shelli | Den
Sigal | Den
Alexander | Lex
Irene | Matthew
...Code language: plaintext (plaintext)由於內連線子句只包含在另一個表中有匹配行的記錄,因此該查詢的結果集中不包括 CEO。
要在結果集中包含 CEO,您可以使用 LEFT JOIN 子句代替 INNER JOIN 子句。
使用 LEFT JOIN 子句執行自連線 #
以下語句使用 LEFT JOIN 子句執行自連線:
SELECT
e.first_name employee,
m.first_name manager
FROM
employees e
LEFT JOIN employees m ON m.employee_id = e.manager_id
ORDER BY
manager NULLS FIRST;Code language: SQL (Structured Query Language) (sql)輸出
employee | manager
-------------+-----------
Steven | NULL
Bruce | Alexander
David | Alexander
Valli | Alexander
Diana | Alexander
Sigal | Den
Guy | Den
Alexander | Den
Shelli | Den
Karen | Den
Alexander | Lex
Irene | Matthew
...Code language: plaintext (plaintext)摘要 #
- 自連線是一種比較同一表內行的連線。
- 使用內連線、左連線或全連線來執行自連線。
- 在查詢中使用表別名,將同一個表視為兩個獨立的表。
測驗 #
資料庫 #
本教程是否有幫助?