SQL INNER JOIN 操作

在本教程中,你將學習如何使用 SQL 內部聯接從兩個表中獲取資料。

使用內部聯接

INNER JOIN 是最常見的聯接型別。它僅返回兩個連線表中具有匹配項的行。以下維恩圖說明了內連線的工作原理。

SQL 內連線圖

為了便於理解,讓我們看看以下 employeesdepartments 表。

Table: employees

+--------+--------------+------------+---------+
| emp_id | emp_name     | hire_date  | dept_id |
+--------+--------------+------------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |       4 |
|      2 | Tony Montana | 2002-07-15 |       1 |
|      3 | Sarah Connor | 2005-10-18 |       5 |
|      4 | Rick Deckard | 2007-01-03 |       3 |
|      5 | Martin Blank | 2008-06-24 |    NULL |
+--------+--------------+------------+---------+

Table: departments

+---------+------------------+
| dept_id | dept_name        |
+---------+------------------+
|       1 | Administration   |
|       2 | Customer Service |
|       3 | Finance          |
|       4 | Human Resources  |
|       5 | Sales            |
+---------+------------------+

現在,假設你需要僅檢索分配到特定部門的員工的 ID,名稱,僱用日期和部門名稱。因為,在現實生活中,可能會有一些員工尚未分配到某個部門,例如 employees 表中的第五個員工“Martin Blank” 。但問題是,如何從同一 SQL 查詢中的檢索兩個表中的資料? 好吧,讓我們來看看。

如果你看到 employees 表,你會注意到它有一個名為 dept_id 的列,其中包含每個員工分配到的部門的 ID,employees 表的 dept_id 列是 departments 表的外來鍵,以及因此,我們將使用此列作為這兩個表之間的橋樑。

這是一個示例,通過使用公共 dept_id 列將 employeesdepartments 表連線在一起來檢索員工的 ID,姓名,僱用日期及其部門。它排除了那些未被分配到任何部門的員工。

SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
FROM employees AS t1 INNER JOIN departments AS t2
ON t1.dept_id = t2.dept_id ORDER BY emp_id;

提示: 連線表時,在每個列名前加上它所屬的表的名稱(例如 employees.dept_iddepartments.dept_id 或者 t1.dept_idt2.dept_id 如果你使用表別名的話),以避免在不同表中的列具有的情況下出現混淆和模糊列錯誤一樣的名字。

注意: 為了節省時間,你可以在查詢中使用表別名來代替鍵入長表名稱。例如,你可以為 employees 表提供別名 - t1 ,然後使用 t1.emp_name 引用 emp_name 而不是使用 employees.emp_name

引用其列執行上面的命令後,你得到如下結果集:

+ -------- + -------------- + ------------ + ------------ ----- +

| emp_id | emp_name | hire_date | dept_name |

+ -------- + -------------- + ------------ + ------------ ----- +

| 1 | Ethan Hunt | 2001-05-01 | 人力資源|

| 2 | 託尼蒙大拿| 2002-07-15 | 管理|

| 3 | 莎拉康納| 2005-10-18 | 銷售|

| 4 | Rick Deckard | 2007-01-03 | 財務|

+ -------- + -------------- + ------------ + ------------ ----- +

如你所見,結果集僅包含那些存在 dept_id 值的員工,該值也存在於 departments 表的 dept_id 列中。