1. 程式人生 > SQL入門教學 >23 SQL Join3

23 SQL Join3

1. 前言

上一小節中我們學習到了外連線,本小節我們將介紹一種特殊的連線——自連線

本小節測試資料如下,請先在資料庫中執行:

DROP TABLE IF EXISTS imooc_employee;
CREATE TABLE imooc_employee
(
 id int PRIMARY KEY,
 employee_name varchar(20),
 salary int,
 manager_id int
);
INSERT INTO imooc_employee VALUES(1, 'Joe', 7000, 3);
INSERT INTO imooc_employee VALUES(2, 'Henry'
, 8000, 4); INSERT INTO imooc_employee VALUES(3, 'Sam', 6000, NULL); INSERT INTO imooc_employee VALUES(4, 'Pedro', 9000, NULL);

說明: 我們新建一個 imooc_employee 表,imooc_employee 表包含了所有員工,員工的經理(manager_id)也屬於員工,如果manager_id 欄位為 NULL,則表示該員工暫無經理。

2. 自連線

自連線指的是與自身進行連線,即表 A 與表 A 自身進行連線,是一種特殊的連線方式。

2.1 例1、查詢薪水

請編寫 SQL 語句,查詢imooc_employee

中收入超過其經理的員工的姓名。

分析:

我們可以把 manager_id 理解為一個外來鍵,這個外來鍵指向經理 id,只不過是表與其自身的關聯;因此可以充分利用連線操作,將表 imooc_employee 與其自身連線,連線條件是 manager_id 和 id。

表 a 可以理解為員工表,表 b 理解為經理表,篩選條件為員工表的薪水大於經理表薪水。

語句

整理可得語句如下:

SELECT a.employee_name
FROM imooc_employee AS a
JOIN imooc_employee AS b
ON a.manager_id = b.id
WHERE a.salary >
b.salary;

結果如下:

+---------------+
| employee_name |
+---------------+
| Joe           |
+---------------+

由於自連線是與自身進行連線,因此對於別名的要求是必須的,否則解析引擎無法判斷出二者之間的關係。

3. 個人經驗

  • 自連線雖然使用較少,但往往在有的時候可以起到奇效。

  • 在使用自連線時,請先指定好別名,然後將其當作兩張表來處理,這樣就不會引起歧義了。