首先明確一下定義: 內連接:在多表查詢的時候,只檢索出表之間相互匹配的行(滿足匹配條件的行),結果中不包括兩個表之間不匹配的行。 一個不太準確但易懂的例子:比如有兩個表,表1存儲了 (1,2,3,4,5 )這五個數字。表2存儲了(3,4,5,6,7,8)這6個數字。多表查詢時兩個表的關聯條件是 “表 ...
首先明確一下定義:
內連接:在多表查詢的時候,只檢索出表之間相互匹配的行(滿足匹配條件的行),結果中不包括兩個表之間不匹配的行。
一個不太準確但易懂的例子:比如有兩個表,表1存儲了 (1,2,3,4,5 )這五個數字。表2存儲了(3,4,5,6,7,8)這6個數字。多表查詢時兩個表的關聯條件是 “表1 = 表2”.
那麼檢索的輸出就是取這兩個表的交集。,即 3,4,5.
外連接:在多表查詢的時候,處理檢索出內連接的數據外,還返回左表(或者右表)中不滿足匹配條件的行。這種連接稱為左(或者右)外連接。
還是上邊那個小例子:左外連接的返回結果為(1,2,3,4,5);右外連接的返回結果為(3,4,5,6,7,8).
如果是左外連接,則連接條件中左邊的表也稱為主表 ,右邊的表稱為從表 。如下簡圖:
如果是右外連接,則連接條件中右邊的表也稱為主表 ,左邊的表稱為從表 。
代碼實現:
下麵是代碼舉例中要用到的3個表
employees表:
+----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employee_id | int | NO | PRI | 0 | |
| first_name | varchar(20) | YES | | NULL | |
| last_name | varchar(25) | NO | | NULL | |
| email | varchar(25) | NO | UNI | NULL | |
| phone_number | varchar(20) | YES | | NULL | |
| hire_date | date | NO | | NULL | |
| job_id | varchar(10) | NO | MUL | NULL | |
| salary | double(8,2) | YES | | NULL | |
| commission_pct | double(2,2) | YES | | NULL | |
| manager_id | int | YES | MUL | NULL | |
| department_id | int | YES | MUL | NULL | |
+----------------+-------------+------+-----+---------+-------+
departments表:
+-----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| department_id | int | NO | PRI | 0 | |
| department_name | varchar(30) | NO | | NULL | |
| manager_id | int | YES | MUL | NULL | |
| location_id | int | YES | MUL | NULL | |
+-----------------+-------------+------+-----+---------+-------+
locations表:
+----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| location_id | int | NO | PRI | 0 | |
| street_address | varchar(40) | YES | | NULL | |
| postal_code | varchar(12) | YES | | NULL | |
| city | varchar(30) | NO | | NULL | |
| state_province | varchar(25) | YES | | NULL | |
| country_id | char(2) | YES | MUL | NULL | |
+----------------+-------------+------+-----+---------+-------+
註:以下所用語法:JOIN...ON 為 SQL99 中的多表查詢實現語法。
內連接:檢索返回員工姓名,部門名組成的表(需要用到employees表及departments表)
mysql> SELECT last_name,department_name
-> FROM employees e # 表1 JOIN 表2 ON 匹配條件;
-> JOIN departments d
-> ON e.department_id = d.department_id; # 關聯條件
檢索返回員工姓名、部門名稱、部門所在城市組成的表。
mysql> SELECT last_name,department_name,city
-> FROM employees e
-> JOIN departments d
-> ON e.department_id = d.department_id
-> JOIN locations l
-> ON d.location_id = l.location_id;
/*
表1
JOIN 表2
ON 表1和表2的匹配條件
JOIN 表3
ON 表2和表3的匹配條件;
*/
外連接:從兩個表中,檢索返回所有員工的姓名、部門名組成的表。
mysql> SELECT employee_id,department_name
-> FROM employees e # employees表為主表,departments表為從表。主表 LEFT OUTER JOIN 從表 ON 匹配條件;
-> LEFT OUTER JOIN departments d # 左外連接
-> ON e.department_id = d.department_id;