在本教程中,您將學(xué)習(xí)如何使用SQL內(nèi)部聯(lián)接從兩個(gè)表中獲取數(shù)據(jù)。
INNER JOIN是最常見的連接類型。它僅返回在兩個(gè)聯(lián)接表中都匹配的行。下維恩圖說明了內(nèi)部聯(lián)接的工作方式。
為了容易理解這一點(diǎn),讓我們來看看下面employees和departments表。
+--------+--------------+------------+---------+ | 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 | +--------+--------------+------------+---------+ | +---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ | |
表: employees | 表: departments |
現(xiàn)在,假設(shè)您只需要檢索分配給特定部門的那些員工的emp_id ,emp_name,hire_date和dept_name。因?yàn)樵趯?shí)際情況中,可能有些雇員尚未分配到部門,例如我們employees表中的第五名雇員“ Martin Blank” 。但是這里的問題是,如何在同一個(gè)SQL查詢中從兩個(gè)表中檢索數(shù)據(jù)?
如果您看到employees表,您會(huì)注意到它有一個(gè)名為dept_id的列,該列保存每個(gè)雇員分配到的部門的ID,即按技術(shù)術(shù)語來說,employees表的dept_id列是departments表的外鍵, 因此,我們將使用此列作為這兩個(gè)表之間的橋梁。
這是一個(gè)示例,該示例通過使用通用的dept_id列將employee 和departments表連接在一起來檢索員工的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;
提示:聯(lián)接表時(shí),請?jiān)诿總€(gè)列名稱前添加其所屬表的名稱(例如 employees.dept_id,departments.dept_id 或 t1.dept_id,t2.dept_id 如果您使用表別名),以避免萬一不同表中的列存在混淆和歧義的列錯(cuò)誤同名。
注意:為了節(jié)省時(shí)間,可以在查詢中使用表別名代替鍵入長表名。 例如,您可以為employees表賦予別名t1,并使用t1.emp_name而不是employees.emp_name 來引用其列emp_name。執(zhí)行完上述命令后,您將得到如下結(jié)果集:
+--------+--------------+------------+-----------------+ | emp_id | emp_name | hire_date | dept_name | +--------+--------------+------------+-----------------+ | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 2 | Tony Montana | 2002-07-15 | Administration | | 3 | Sarah Connor | 2005-10-18 | Sales | | 4 | Rick Deckard | 2007-01-03 | Finance | +--------+--------------+------------+-----------------+
正如您看到的,結(jié)果集僅包含具有dept_id值的雇員,并且該值也存在于department表的dept_id列中。