1. 程式人生 > 資料庫 >MySQL聯表查詢的簡單示例

MySQL聯表查詢的簡單示例

MySql會用到聯表查詢,對於剛學習的新手來說,可能會理解起來有難度。下面這篇文章就來給大家詳細介紹MySQL聯表查詢的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧

關係型資料庫,免不了表之間存在各種引用與關聯。這些關聯是通過主鍵與外來鍵搭配來形成的。所以,取資料時,很大情況下單張表無法滿足需求,額外的資料則需要將其他表加入到查詢中來,這便是 JOIN 關鍵字完成的操作。

  • MySQL 中 JOIN,CROSS JOIN 和 INNER JOIN 三者語法功能上相同,可互換,而 SQL 標準中,INNER JOIN 需要搭配 ON 語句。

多表聯合查詢時,可省略 JOIN 關鍵字,以逗號分隔多張表,此時預設會當作 INNER JOIN 來處理。比如,

SELECT table1.*,table2.* 
FROM table1,table2; 

等效於:

SELECT table1.*,table2.* 
FROM table1 
  INNER JOIN table2; 
  • 但這種通過逗號隱式指定的聯表形式其優先順序要低於直接通過關鍵字(INNER JOIN,CROSS JOIN,LEFT JOIN)指定的形式。所以 t1,t2 JOIN t3 會被解析成 (t1,(t2 JOIN t3)) 而不是 ((t1,t2) JOIN t3)

需要注意的是,當逗號形式與其他聯表關鍵詞結合時,在指定了聯表條件,比如通過 ON 條件時,會報錯。

  • ON 指定的聯表條件其語法同 WHERE,所有後者可接受的表示式都可用於 ON。兩者看起來功能上雷同,ON 一般用於指定聯表條件,即表之間怎麼被聯合,而 WHERE 則用於過濾結果。
  • LEFT JOIN 時,右邊表中不滿足 ON 或 USING 指定的條件時,會在結果中以 NULL 呈現。
SELECT left_tbl.*
 FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
 WHERE right_tbl.id IS NULL;

通過此方法可方便地過濾出右邊表中不符合條件的記錄。

  • 聯表查詢時可為每張參與進來的表指定別名,方便在其他表示式中引用。兩種方式,一個是通過 AS 關鍵字 tbl_name AS alias_name,另一種是直接在表名後面跟上別名,tbl_name alias_name。
SELECT t1.name,t2.salary
 FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

SELECT t1.name,t2.salary
 FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
  • 一條查詢語句中的子查詢必需取一個別名,這樣才能在其他表示式中引用。
SELECT * FROM (SELECT 1,2,3) AS t1;
  • USING(join_column_list) 語句指定兩個表中均包含的列,查詢時只針對這裡指定的列進行比較。
a LEFT JOIN b USING (c1,c2,c3)
  • NATURAL [LEFT] JOIN 與 INNER JOIN 和 LEFT JOIN 配合使用了 USING 指定表中所有列的情況等效。
  • RIGHT JOIN 與 LEFT JOIN 類似,只是最終結果是依據右邊表,將左邊表中不符合的在結果中以 NULL 呈現。為了方便在不同資料庫間遷移,推薦始終使用 LEFT JOIN。

一些 JOIN 示例:

SELECT * FROM table1,table2;

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 USING (id);

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
 LEFT JOIN table3 ON table2.id = table3.id;
  • NATURAL JOIN 的結果中不會有重複的列。因為其與 USING 雷同,所以 USING 時也沒有複雜的列。

考察下面的示例:

CREATE TABLE t1 (i INT,j INT);
CREATE TABLE t2 (k INT,j INT);
INSERT INTO t1 VALUES(1,1);
INSERT INTO t2 VALUES(1,1);
SELECT * FROM t1 NATURAL JOIN t2;
SELECT * FROM t1 JOIN t2 USING (j);

查詢結果:

+------+------+------+
| j | i | k |
+------+------+------+
| 1 | 1 | 1 |
+------+------+------+
+------+------+------+
| j | i | k |
+------+------+------+
| 1 | 1 | 1 |
+------+------+------+

結果中同名的列只出現一次,且都是值相同的那些記錄。

通過向兩表中插入一條新記錄,令它們的 j 不相同,再進行測試。

mysql> INSERT INTO t1 VALUES(2,2);
Query OK,1 row affected (0.00 sec)

mysql> INSERT INTO t2 VALUES(2,3);
Query OK,1 row affected (0.00 sec)

mysql> select * from t1 natural join t2;
+------+------+------+
| j | i | k |
+------+------+------+
| 2 | 2 | 1 |
+------+------+------+
1 row in set (0.00 sec)
  • USING 和 ON 作為條件時其他限制的聯合條件是一樣的,可互相轉換。但在 SELECT * 返回結果時,還是有差異的。前者只在 USING 中指定的列中返回合併後的結果,後者則針對的是表中所有列。
a LEFT JOIN b USING (c1,c3)
a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2 AND a.c3 = b.c3

USING 情況下的返回:

COALESCE(a.c1,b.c1),COALESCE(a.c2,b.c2),COALESCE(a.c3,b.c3)

ON 的返回:

a.c1,a.c2,a.c3,b.c1,b.c2,b.c3

ON 語句中只能引用其操作表(operands)中的表。

CREATE TABLE t1 (i1 INT);
CREATE TABLE t2 (i2 INT);
CREATE TABLE t3 (i3 INT);

針對上面的表,以下查詢會報錯:

mysql> SELECT * FROM t1 JOIN t2 ON (i1 = i3) JOIN t3;
ERROR 1054 (42S22): Unknown column 'i3' in 'on clause'

而以下查詢則可以:

mysql> SELECT * FROM t1 JOIN t2 JOIN t3 ON (i1 = i3);
Empty set (0.00 sec)

因為此時 t3 在 ON 語句的操作範圍內了。

相關資源

  • MySQL 8.0 Reference Manual - 13.2.10.2 JOIN Syntax
  • MySQL 8.0 Reference Manual - 13.2.10.3 UNION Syntax

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。