MySQL INNER JOIN:內連線查詢

2020-07-16 10:05:23
內連線是通過在查詢中設定連線條件的方式,來移除查詢結果集中某些資料行後的交叉連線。簡單來說,就是利用條件表示式來消除交叉連線的某些資料行。

在 MySQL FROM 子句中使用關鍵字 INNER JOIN 連線兩張表,並使用 ON 子句來設定連線條件。如果沒有任何條件,INNER JOIN 和 CROSS JOIN 在語法上是等同的,兩者可以互換。

語法格式如下:

SELECT <列名1,列名2 …>
FROM <表名1> INNER JOIN <表名2> [ ON子句]

語法說明如下。
  • <列名1,列名2…>:需要檢索的列名。
  • <表名1><表名2>:進行內連線的兩張表的表名。
內連線是系統預設的表連線,所以在 FROM 子句後可以省略 INNER 關鍵字,只用關鍵字 JOIN。使用內連線後,FROM 子句中的 ON 子句可用來設定連線表的條件。

在 FROM 子句中可以在多個表之間連續使用 INNER JOIN 或 JOIN,如此可以同時實現多個表的內連線。

例 1

表 tb_students_info 和表 tb_departments 都包含相同資料型別的欄位 dept_id,在兩個表之間使用內連線查詢。輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT id,name,age,dept_name
    -> FROM tb_students_info,tb_departments
    -> WHERE tb_students_info.dept_id=tb_departments.dept_id;
+----+--------+------+-----------+
| id | name   | age  | dept_name |
+----+--------+------+-----------+
|  1 | Dany   |   25 | Computer  |
|  2 | Green  |   23 | Chinese   |
|  3 | Henry  |   23 | Math      |
|  4 | Jane   |   22 | Computer  |
|  5 | Jim    |   24 | Computer  |
|  6 | John   |   21 | Math      |
|  7 | Lily   |   22 | Computer  |
|  8 | Susan  |   23 | Economy   |
|  9 | Thomas |   22 | Chinese   |
| 10 | Tom    |   23 | Economy   |
+----+--------+------+-----------+
10 rows in set (0.00 sec)
在這裡,SELECT 語句與前面介紹的最大差別是:SELECT 後面指定的列分別屬於兩個不同的表,id、name、age 在表 tb_students_info 中,而 dept_name 在表 tb_departments 中,同時 FROM 字句列出了兩個表 tb_students_info 和 tb_departments。WHERE 子句在這裡作為過濾條件,指明只有兩個表中的 dept_id 欄位值相等的時候才符合連線查詢的條件。

返回的結果可以看到,顯示的記錄是由兩個表中的不同列值組成的新記錄。

提示:因為 tb_students_info 表和 tb_departments 表中有相同的欄位 dept_id,所以在比較的時候,需要完全限定表名(格式為“表名.列名”),如果只給出 dept_id,MySQL 將不知道指的是哪一個,並返回錯誤資訊。

例 2

在 tb_students_info 表和 tb_departments 表之間,使用 INNER JOIN 語法進行內連線查詢,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT id,name,age,dept_name
    -> FROM tb_students_info INNER JOIN tb_departments
    -> WHERE tb_students_info.dept_id=tb_departments.dept_id;
+----+--------+------+-----------+
| id | name   | age  | dept_name |
+----+--------+------+-----------+
|  1 | Dany   |   25 | Computer  |
|  2 | Green  |   23 | Chinese   |
|  3 | Henry  |   23 | Math      |
|  4 | Jane   |   22 | Computer  |
|  5 | Jim    |   24 | Computer  |
|  6 | John   |   21 | Math      |
|  7 | Lily   |   22 | Computer  |
|  8 | Susan  |   23 | Economy   |
|  9 | Thomas |   22 | Chinese   |
| 10 | Tom    |   23 | Economy   |
+----+--------+------+-----------+
10 rows in set (0.00 sec)
在這裡的查詢語句中,兩個表之間的關係通過 INNER JOIN 指定。使用這種語法的時候,連線的條件使用 ON 子句給出,而不是 WHERE,ON 和 WHERE 後面指定的條件相同。

提示:使用 WHERE 子句定義連線條件比較簡單明瞭,而 INNER JOIN 語法是 ANSI SQL 的標準規範,使用 INNER JOIN 連線語法能夠確保不會忘記連線條件,而且 WHERE 子句在某些時候會影響查詢的效能。