MySQL中UNION 和 JOIN 多表聯(lián)合查詢方式
前言
在 MySQL 中,UNION 和 JOIN 是多表查詢的兩種主要方式。它們有不同的適用場(chǎng)景和語(yǔ)法
兩者的差異如下:
特性 | JOIN | UNION |
---|---|---|
數(shù)據(jù)組合 | 橫向組合,合并兩表數(shù)據(jù)到一個(gè)行內(nèi) | 縱向組合,合并兩表數(shù)據(jù)到多個(gè)行 |
數(shù)據(jù)結(jié)構(gòu)要求 | 表間需有關(guān)聯(lián)條件,如外鍵等 | 列數(shù)和數(shù)據(jù)類型需一致 |
結(jié)果數(shù)據(jù)量 | 結(jié)果記錄數(shù)量通常小于表數(shù)據(jù)量 | 結(jié)果記錄數(shù)量可能增加 |
常用場(chǎng)景 | 數(shù)據(jù)關(guān)聯(lián),如訂單與用戶信息查詢 | 數(shù)據(jù)匯總,如多表的類似記錄組合 |
具體的使用選擇:
- 使用 JOIN:
當(dāng)需要將兩表數(shù)據(jù)按照某種邏輯相關(guān)聯(lián)時(shí),選擇 JOIN
- 使用 UNION:
當(dāng)需要合并多表中具有相同結(jié)構(gòu)但無(wú)直接關(guān)系的數(shù)據(jù)時(shí),選擇 UNION
1. JOIN
JOIN 用于在多個(gè)表之間按一定條件關(guān)聯(lián)數(shù)據(jù)
JOIN 查詢通過指定的條件(如外鍵關(guān)系)將表橫向組合
SELECT column_names FROM table1 [INNER|LEFT|RIGHT] JOIN table2 ON table1.column_name = table2.column_name WHERE conditions;
基本的類型有如下:
JOIN 類型
- INNER JOIN(內(nèi)連接)
只返回兩個(gè)表中滿足 ON 條件的記錄
若某條記錄在任一表中沒有匹配項(xiàng),則不會(huì)包含在結(jié)果中
常用于提取相關(guān)數(shù)據(jù)
- LEFT JOIN(左連接)
返回左表中的所有記錄,以及右表中與左表記錄匹配的記錄
如果右表中沒有匹配項(xiàng),則結(jié)果中該記錄右表的字段為 NULL
常用于查找左表中的數(shù)據(jù)即使右表沒有匹配項(xiàng)時(shí)
- RIGHT JOIN(右連接)
返回右表中的所有記錄,以及左表中與右表記錄匹配的記錄
如果左表中沒有匹配項(xiàng),則結(jié)果中該記錄左表的字段為 NULL
不如 LEFT JOIN 常用
- FULL OUTER JOIN(全連接) (MySQL 不直接支持,但可通過 UNION 模擬)
返回兩個(gè)表中所有記錄,不論是否有匹配項(xiàng)
不支持時(shí)用以下替代:
SELECT ... FROM table1 LEFT JOIN table2 ON condition UNION SELECT ... FROM table1 RIGHT JOIN table2 ON condition;
2. UNION
UNION 用于將兩個(gè)或多個(gè)查詢結(jié)果縱向組合為一個(gè)結(jié)果集。它對(duì)查詢的列數(shù)和數(shù)據(jù)類型有要求
基本的語(yǔ)法如下:
SELECT column_names FROM table1 WHERE conditions UNION [ALL] SELECT column_names FROM table2 WHERE conditions;
注意事項(xiàng)有如下:
- 默認(rèn)去重:
UNION 會(huì)去掉結(jié)果集中重復(fù)的記錄
若需要保留所有重復(fù)記錄,使用 UNION ALL
- 列數(shù)和數(shù)據(jù)類型要求:
所有參與查詢的 SELECT 語(yǔ)句必須有相同的列數(shù)
每列的數(shù)據(jù)類型必須兼容
- 結(jié)果排序:
可以通過在 UNION 之后的結(jié)果集中加 ORDER BY 對(duì)整體結(jié)果排序
到此這篇關(guān)于MySQL中UNION 和 JOIN 多表聯(lián)合查詢方式的文章就介紹到這了,更多相關(guān)mysql union和join內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL啟動(dòng)報(bào)錯(cuò)提示發(fā)生系統(tǒng)錯(cuò)誤5,拒絕訪問的原因和解決方法
使用命令net start mysql啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)時(shí)候,出現(xiàn)如下錯(cuò)誤提示發(fā)生系統(tǒng)錯(cuò)誤5,拒絕訪問,所以本文給大家介紹了MySQL啟動(dòng)報(bào)錯(cuò)提示發(fā)生系統(tǒng)錯(cuò)誤5,拒絕訪問的原因和解決方法,需要的朋友可以參考下2024-01-01Can''t connect to MySQL server on ''localhost'' (10048)問題解決方
windows 2003服務(wù)器運(yùn)行php的提示Can't connect to MySQL server on 'localhost' (10048), 下面來看下解決方法2013-09-09如何解決mysql的count()函數(shù)條件表達(dá)式不生效問題
該文章總結(jié)了SQL查詢中`count`函數(shù)統(tǒng)計(jì)錯(cuò)誤的原因,以及三種解決方法:使用`ornull`方法、`IF()`函數(shù)和`casewhen`表達(dá)式,當(dāng)不滿足條件時(shí),表達(dá)式的值為NULL2024-11-11mysql創(chuàng)建觸發(fā)器時(shí)報(bào)1064錯(cuò)誤問題及解決
這篇文章主要介紹了mysql創(chuàng)建觸發(fā)器時(shí)報(bào)1064錯(cuò)誤問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08SQL優(yōu)化老出錯(cuò),那是你沒弄明白MySQL解釋計(jì)劃用法
本篇文章講的是SQL優(yōu)化老出錯(cuò),那是你沒弄明白MySQL解釋計(jì)劃用法,有興趣的小伙伴速度來看看吧,希望本篇文章能夠幫助到你2021-11-11MYSQL如何 查詢數(shù)據(jù)庫(kù)中所有表中的數(shù)據(jù)量
INFORMATION_SCHEMA.TABLES 是 MySQL 中的系統(tǒng)表,用于存儲(chǔ)關(guān)于數(shù)據(jù)庫(kù)中的表的信息,這篇文章主要介紹了MYSQL如何 查詢數(shù)據(jù)庫(kù)中所有表中的數(shù)據(jù)量,需要的朋友可以參考下2024-01-01