濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > MySQL聯(lián)表查詢(xún)的簡(jiǎn)單示例

MySQL聯(lián)表查詢(xún)的簡(jiǎn)單示例

熱門(mén)標(biāo)簽:中國(guó)地圖標(biāo)注公司 電話(huà)機(jī)器人的價(jià)格多少錢(qián)一個(gè)月 天津公司外呼系統(tǒng)軟件 400電話(huà)申請(qǐng)廠家現(xiàn)貨 昌德訊外呼系統(tǒng) 徐涇鎮(zhèn)騰訊地圖標(biāo)注 百度地圖標(biāo)注要什么軟件 自己做地圖標(biāo)注需要些什么 福建外呼電銷(xiāo)機(jī)器人加盟

MySql會(huì)用到聯(lián)表查詢(xún),對(duì)于剛學(xué)習(xí)的新手來(lái)說(shuō),可能會(huì)理解起來(lái)有難度。下面這篇文章就來(lái)給大家詳細(xì)介紹MySQL聯(lián)表查詢(xún)的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

關(guān)系型數(shù)據(jù)庫(kù),免不了表之間存在各種引用與關(guān)聯(lián)。這些關(guān)聯(lián)是通過(guò)主鍵與外鍵搭配來(lái)形成的。所以,取數(shù)據(jù)時(shí),很大情況下單張表無(wú)法滿(mǎn)足需求,額外的數(shù)據(jù)則需要將其他表加入到查詢(xún)中來(lái),這便是 JOIN 關(guān)鍵字完成的操作。

  • MySQL 中 JOIN, CROSS JOIN 和 INNER JOIN 三者語(yǔ)法功能上相同,可互換,而 SQL 標(biāo)準(zhǔn)中,INNER JOIN 需要搭配 ON 語(yǔ)句。

多表聯(lián)合查詢(xún)時(shí),可省略 JOIN 關(guān)鍵字,以逗號(hào)分隔多張表,此時(shí)默認(rèn)會(huì)當(dāng)作 INNER JOIN 來(lái)處理。比如,

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

等效于:

SELECT table1.*, 
  table2.* 
FROM table1 
  INNER JOIN table2; 
  • 但這種通過(guò)逗號(hào)隱式指定的聯(lián)表形式其優(yōu)先級(jí)要低于直接通過(guò)關(guān)鍵字(INNER JOIN, CROSS JOIN, LEFT JOIN)指定的形式。所以 t1, t2 JOIN t3 會(huì)被解析成 (t1, (t2 JOIN t3)) 而不是 ((t1, t2) JOIN t3)

需要注意的是,當(dāng)逗號(hào)形式與其他聯(lián)表關(guān)鍵詞結(jié)合時(shí),在指定了聯(lián)表?xiàng)l件,比如通過(guò) ON 條件時(shí),會(huì)報(bào)錯(cuò)。

  • ON 指定的聯(lián)表?xiàng)l件其語(yǔ)法同 WHERE,所有后者可接受的表達(dá)式都可用于 ON。兩者看起來(lái)功能上雷同,ON 一般用于指定聯(lián)表?xiàng)l件,即表之間怎么被聯(lián)合,而 WHERE 則用于過(guò)濾結(jié)果。
  • LEFT JOIN 時(shí),右邊表中不滿(mǎn)足 ON 或 USING 指定的條件時(shí),會(huì)在結(jié)果中以 NULL 呈現(xiàn)。
SELECT left_tbl.*
 FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
 WHERE right_tbl.id IS NULL;

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

  • 聯(lián)表查詢(xún)時(shí)可為每張參與進(jìn)來(lái)的表指定別名,方便在其他表達(dá)式中引用。兩種方式,一個(gè)是通過(guò) AS 關(guān)鍵字 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;
  • 一條查詢(xún)語(yǔ)句中的子查詢(xún)必需取一個(gè)別名,這樣才能在其他表達(dá)式中引用。
SELECT * FROM (SELECT 1, 2, 3) AS t1;
  • USING(join_column_list) 語(yǔ)句指定兩個(gè)表中均包含的列,查詢(xún)時(shí)只針對(duì)這里指定的列進(jìn)行比較。
a LEFT JOIN b USING (c1, c2, c3)
  • NATURAL [LEFT] JOIN 與 INNER JOIN 和 LEFT JOIN 配合使用了 USING 指定表中所有列的情況等效。
  • RIGHT JOIN 與 LEFT JOIN 類(lèi)似,只是最終結(jié)果是依據(jù)右邊表,將左邊表中不符合的在結(jié)果中以 NULL 呈現(xiàn)。為了方便在不同數(shù)據(jù)庫(kù)間遷移,推薦始終使用 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 的結(jié)果中不會(huì)有重復(fù)的列。因?yàn)槠渑c USING 雷同,所以 USING 時(shí)也沒(méi)有復(fù)雜的列。

考察下面的示例:

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);

查詢(xún)結(jié)果:

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

結(jié)果中同名的列只出現(xiàn)一次,且都是值相同的那些記錄。

通過(guò)向兩表中插入一條新記錄,令它們的 j 不相同,再進(jìn)行測(cè)試。

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 作為條件時(shí)其他限制的聯(lián)合條件是一樣的,可互相轉(zhuǎn)換。但在 SELECT * 返回結(jié)果時(shí),還是有差異的。前者只在 USING 中指定的列中返回合并后的結(jié)果,后者則針對(duì)的是表中所有列。
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 語(yǔ)句中只能引用其操作表(operands)中的表。

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

針對(duì)上面的表,以下查詢(xún)會(huì)報(bào)錯(cuò):

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

而以下查詢(xún)則可以:

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

因?yàn)榇藭r(shí) t3 在 ON 語(yǔ)句的操作范圍內(nèi)了。

相關(guān)資源

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • mysql嵌套查詢(xún)和聯(lián)表查詢(xún)優(yōu)化方法
  • mysql 行列動(dòng)態(tài)轉(zhuǎn)換的實(shí)現(xiàn)(列聯(lián)表,交叉表)
  • MySQL中聯(lián)表更新與刪除的語(yǔ)法介紹
  • mysql刪除關(guān)聯(lián)表的實(shí)操方法

標(biāo)簽:梅河口 陜西 駐馬店 昌都 鄂爾多斯 黔西 北京 荊門(mén)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL聯(lián)表查詢(xún)的簡(jiǎn)單示例》,本文關(guān)鍵詞  MySQL,聯(lián)表,查詢(xún),的,簡(jiǎn)單,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL聯(lián)表查詢(xún)的簡(jiǎn)單示例》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于MySQL聯(lián)表查詢(xún)的簡(jiǎn)單示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    福鼎市| 边坝县| 龙门县| 屏南县| 左权县| 阜新市| 聂荣县| 儋州市| 仙桃市| 新巴尔虎右旗| 永嘉县| 秦安县| 商都县| 盐津县| 汝州市| 察隅县| 综艺| 农安县| 富源县| 佛教| 泽库县| 林口县| 德保县| 封丘县| 乐安县| 象州县| 宜宾市| 色达县| 定边县| 香格里拉县| 礼泉县| 南开区| 景泰县| 齐河县| 手游| 辽宁省| 博客| 上栗县| 崇州市| 太白县| 中西区|