久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何在MySQL中實現聯表查詢

141次閱讀
沒有評論

共計 3094 個字符,預計需要花費 8 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章將為大家詳細講解有關如何在 MySQL 中實現聯表查詢,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

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, c2, 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)

關于如何在 MySQL 中實現聯表查詢就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計3094字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 改则县| 黔南| 荆门市| 大化| 宜宾市| 本溪市| 十堰市| 额敏县| 新邵县| 治县。| 保山市| 渭南市| 广昌县| 铜川市| 灵璧县| 来宾市| 长乐市| 长丰县| 弥渡县| 丰原市| 伊宁县| 南川市| 拉孜县| 高雄县| 石门县| 漳州市| 无锡市| 简阳市| 泉州市| 象州县| 宁武县| 方正县| 南漳县| 怀远县| 盐城市| 林芝县| 汉寿县| 丹阳市| 逊克县| 利川市| 通辽市|