Mysql連接查詢(xún)之內(nèi)連接、外連接與復(fù)合條件查詢(xún)完全解析
前言
在 MySQL 中,連接查詢(xún)(JOIN) 是多表數(shù)據(jù)關(guān)聯(lián)查詢(xún)的核心語(yǔ)法,用于從兩張及以上表中提取關(guān)聯(lián)數(shù)據(jù)。本文圍繞圖片中的核心知識(shí)點(diǎn),從語(yǔ)法、場(chǎng)景、代碼示例三個(gè)維度,帶你徹底掌握 MySQL 連接查詢(xún)。
一、核心知識(shí)點(diǎn)總覽
| 連接類(lèi)型 | 語(yǔ)法 | 核心邏輯 | 結(jié)果特點(diǎn) |
|---|---|---|---|
| 內(nèi)連接(INNER JOIN) | A INNER JOIN B ON 關(guān)聯(lián)條件 | 只返回兩張表中匹配成功的記錄 | 無(wú)匹配數(shù)據(jù)不顯示 |
| 左連接(LEFT JOIN) | A LEFT JOIN B ON 關(guān)聯(lián)條件 | 以左表 A 為基準(zhǔn),匹配右表 B;左表全顯示,右表無(wú)匹配則補(bǔ) NULL | 左表數(shù)據(jù)完整,右表按需補(bǔ)空 |
| 右連接(RIGHT JOIN) | A RIGHT JOIN B ON 關(guān)聯(lián)條件 | 以右表 B 為基準(zhǔn),匹配左表 A;右表全顯示,左表無(wú)匹配則補(bǔ) NULL | 右表數(shù)據(jù)完整,左表按需補(bǔ)空 |
| 復(fù)合條件連接 | 連接查詢(xún) + 多條件過(guò)濾 | 在連接基礎(chǔ)上,追加 WHERE/ON 多條件篩選 | 精準(zhǔn)過(guò)濾關(guān)聯(lián)數(shù)據(jù) |
二、準(zhǔn)備測(cè)試數(shù)據(jù)
先創(chuàng)建兩張關(guān)聯(lián)表,用于后續(xù)所有示例:
1. 學(xué)生表student(左表)
CREATE TABLE score (
score_id INT PRIMARY KEY AUTO_INCREMENT,
stu_id INT NOT NULL,
subject VARCHAR(20) NOT NULL,
score INT NOT NULL,
FOREIGN KEY (stu_id) REFERENCES student(stu_id)
);
INSERT INTO score (stu_id, subject, score) VALUES
(1, '語(yǔ)文', 85),
(1, '數(shù)學(xué)', 92),
(2, '語(yǔ)文', 78),
(3, '數(shù)學(xué)', 88); -- 趙六(stu_id=4)無(wú)成績(jī)2. 成績(jī)表score(右表)
CREATE TABLE score (
score_id INT PRIMARY KEY AUTO_INCREMENT,
stu_id INT NOT NULL,
subject VARCHAR(20) NOT NULL,
score INT NOT NULL,
FOREIGN KEY (stu_id) REFERENCES student(stu_id)
);
INSERT INTO score (stu_id, subject, score) VALUES
(1, '語(yǔ)文', 85),
(1, '數(shù)學(xué)', 92),
(2, '語(yǔ)文', 78),
(3, '數(shù)學(xué)', 88); -- 趙六(stu_id=4)無(wú)成績(jī)三、各連接類(lèi)型詳解 + 代碼示例
1. 內(nèi)連接查詢(xún)(INNER JOIN)
核心邏輯
內(nèi)連接是最常用的連接方式,只返回兩張表中滿(mǎn)足關(guān)聯(lián)條件的記錄,相當(dāng)于 “取兩張表的交集”。
- 等價(jià)語(yǔ)法:
SELECT * FROM A,B WHERE A.id = B.id(隱式內(nèi)連接) - 標(biāo)準(zhǔn)語(yǔ)法:
SELECT * FROM A INNER JOIN B ON A.id = B.id(顯式內(nèi)連接,推薦)
代碼示例
-- 顯式內(nèi)連接:查詢(xún)有成績(jī)的學(xué)生信息+成績(jī)
SELECT
s.stu_id, s.stu_name, s.class,
sc.subject, sc.score
FROM student s
INNER JOIN score sc
ON s.stu_id = sc.stu_id;運(yùn)行結(jié)果
| stu_id | stu_name | class | subject | score |
|---|---|---|---|---|
| 1 | 張三 | 一班 | 語(yǔ)文 | 85 |
| 1 | 張三 | 一班 | 數(shù)學(xué) | 92 |
| 2 | 李四 | 二班 | 語(yǔ)文 | 78 |
| 3 | 王五 | 一班 | 數(shù)學(xué) | 88 |
說(shuō)明
- 趙六(stu_id=4)無(wú)成績(jī),內(nèi)連接中不會(huì)顯示,因?yàn)橛冶頍o(wú)匹配數(shù)據(jù)。
2. 外連接查詢(xún)
外連接會(huì)以某一張表為基準(zhǔn),保留基準(zhǔn)表的所有數(shù)據(jù),另一張表無(wú)匹配則補(bǔ) NULL,分為左連接和右連接。
(1)左連接(LEFT JOIN)
核心邏輯
以左表為基準(zhǔn),左表所有記錄全部顯示,右表匹配到則顯示數(shù)據(jù),匹配不到則補(bǔ) NULL。
- 語(yǔ)法:
A LEFT JOIN B ON 關(guān)聯(lián)條件(A 是左表,B 是右表)
代碼示例
-- 左連接:以學(xué)生表為基準(zhǔn),查詢(xún)所有學(xué)生(含無(wú)成績(jī)的趙六)
SELECT
s.stu_id, s.stu_name, s.class,
sc.subject, sc.score
FROM student s
LEFT JOIN score sc
ON s.stu_id = sc.stu_id;運(yùn)行結(jié)果
| stu_id | stu_name | class | subject | score |
|---|---|---|---|---|
| 1 | 張三 | 一班 | 語(yǔ)文 | 85 |
| 1 | 張三 | 一班 | 數(shù)學(xué) | 92 |
| 2 | 李四 | 二班 | 語(yǔ)文 | 78 |
| 3 | 王五 | 一班 | 數(shù)學(xué) | 88 |
| 4 | 趙六 | 三班 | NULL | NULL |
說(shuō)明
- 左表(學(xué)生表)的所有學(xué)生都顯示,趙六無(wú)成績(jī),右表字段補(bǔ)
NULL。
(2)右連接(RIGHT JOIN)
核心邏輯
以右表為基準(zhǔn),右表所有記錄全部顯示,左表匹配到則顯示數(shù)據(jù),匹配不到則補(bǔ) NULL。
- 語(yǔ)法:
A RIGHT JOIN B ON 關(guān)聯(lián)條件(B 是右表,A 是左表) - 本質(zhì):
A LEFT JOIN B等價(jià)于B RIGHT JOIN A,可互相轉(zhuǎn)換,實(shí)際開(kāi)發(fā)中優(yōu)先用左連接(可讀性更強(qiáng))
代碼示例
-- 右連接:以成績(jī)表為基準(zhǔn),查詢(xún)所有成績(jī)(無(wú)學(xué)生的成績(jī)不會(huì)出現(xiàn),本例無(wú)此場(chǎng)景)
SELECT
s.stu_id, s.stu_name, s.class,
sc.subject, sc.score
FROM student s
RIGHT JOIN score sc
ON s.stu_id = sc.stu_id;運(yùn)行結(jié)果
與內(nèi)連接結(jié)果完全一致(因?yàn)槌煽?jī)表的所有記錄都能匹配到學(xué)生表)。
3. 復(fù)合條件連接查詢(xún)
核心邏輯
在連接查詢(xún)的基礎(chǔ)上,追加多個(gè)過(guò)濾條件,精準(zhǔn)篩選關(guān)聯(lián)數(shù)據(jù)。條件可寫(xiě)在 ON 子句(連接時(shí)過(guò)濾)或 WHERE 子句(連接后過(guò)濾)。
代碼示例 1:連接 + 單條件過(guò)濾
-- 左連接+WHERE:查詢(xún)一班所有學(xué)生(含無(wú)成績(jī))
SELECT
s.stu_id, s.stu_name, s.class,
sc.subject, sc.score
FROM student s
LEFT JOIN score sc
ON s.stu_id = sc.stu_id
WHERE s.class = '一班';運(yùn)行結(jié)果
| stu_id | stu_name | class | subject | score |
|---|---|---|---|---|
| 1 | 張三 | 一班 | 語(yǔ)文 | 85 |
| 1 | 張三 | 一班 | 數(shù)學(xué) | 92 |
| 3 | 王五 | 一班 | 數(shù)學(xué) | 88 |
代碼示例 2:多條件復(fù)合連接
-- 復(fù)合條件:左連接+多條件,查詢(xún)一班成績(jī)>80的學(xué)生,無(wú)成績(jī)也顯示
SELECT
s.stu_id, s.stu_name, s.class,
sc.subject, sc.score
FROM student s
LEFT JOIN score sc
ON s.stu_id = sc.stu_id
AND sc.score > 80 -- 連接時(shí)過(guò)濾成績(jī)>80
WHERE s.class = '一班'; -- 過(guò)濾班級(jí)運(yùn)行結(jié)果
| stu_id | stu_name | class | subject | score |
|---|---|---|---|---|
| 1 | 張三 | 一班 | 數(shù)學(xué) | 92 |
| 3 | 王五 | 一班 | 數(shù)學(xué) | 88 |
關(guān)鍵說(shuō)明:ON與WHERE的區(qū)別
ON子句:連接時(shí)過(guò)濾,只影響右表的匹配,不影響左表的顯示(左表仍全顯示)WHERE子句:連接后過(guò)濾,會(huì)直接過(guò)濾最終結(jié)果,不符合條件的行直接刪除
四、核心對(duì)比與避坑指南
1. 內(nèi)連接 vs 外連接 核心區(qū)別
| 場(chǎng)景 | 推薦連接 | 原因 |
|---|---|---|
| 只需要匹配成功的數(shù)據(jù) | 內(nèi)連接 | 結(jié)果最精簡(jiǎn),性能最優(yōu) |
| 需要保留左表所有數(shù)據(jù) | 左連接 | 左表完整,右表補(bǔ)空 |
| 需要保留右表所有數(shù)據(jù) | 右連接 | 可轉(zhuǎn)換為左連接,優(yōu)先用左連接 |
2. 常見(jiàn)避坑
1.關(guān)聯(lián)條件缺失:多表連接必須加 ON 關(guān)聯(lián)條件,否則會(huì)產(chǎn)生笛卡爾積(數(shù)據(jù)爆炸)
-- 錯(cuò)誤!無(wú)關(guān)聯(lián)條件,笛卡爾積 SELECT * FROM student, score;
2.ON 與 WHERE 混用:外連接中,WHERE 會(huì)過(guò)濾左表數(shù)據(jù),導(dǎo)致外連接失效
-- 錯(cuò)誤!WHERE sc.score>80 會(huì)過(guò)濾掉趙六的NULL行,左連接變內(nèi)連接 SELECT * FROM student s LEFT JOIN score sc ON s.stu_id=sc.stu_id WHERE sc.score>80;
3.表別名不規(guī)范:多表同名字段必須加表別名,否則報(bào)錯(cuò)
-- 錯(cuò)誤!stu_id 不明確屬于哪個(gè)表 SELECT stu_id FROM student s JOIN score sc ON s.stu_id=sc.stu_id; -- 正確:加表別名 SELECT s.stu_id FROM student s JOIN score sc ON s.stu_id=sc.stu_id;
五、綜合實(shí)戰(zhàn):多表連接 + 復(fù)合條件
-- 需求:查詢(xún)所有學(xué)生的總分,無(wú)成績(jī)的學(xué)生總分顯示0,按班級(jí)分組
SELECT
s.class,
s.stu_name,
IFNULL(SUM(sc.score), 0) AS total_score -- IFNULL 把NULL轉(zhuǎn)為0
FROM student s
LEFT JOIN score sc
ON s.stu_id = sc.stu_id
GROUP BY s.stu_id, s.stu_name, s.class
ORDER BY total_score DESC;運(yùn)行結(jié)果
| class | stu_name | total_score |
|---|---|---|
| 一班 | 張三 | 177 |
| 一班 | 王五 | 88 |
| 二班 | 李四 | 78 |
| 三班 | 趙六 | 0 |
六、核心總結(jié)
- 內(nèi)連接:取交集,只顯示匹配數(shù)據(jù)
- 左連接:左表全顯,右表補(bǔ)空;右連接:右表全顯,左表補(bǔ)空
- 復(fù)合條件:
ON過(guò)濾連接,WHERE過(guò)濾結(jié)果,不可混用 - 避坑關(guān)鍵:必須加關(guān)聯(lián)條件,同名字段加別名,外連接慎用
WHERE過(guò)濾 - 性能優(yōu)化:大表連接優(yōu)先用內(nèi)連接,關(guān)聯(lián)字段加索引,避免笛卡爾積
到此這篇關(guān)于Mysql連接查詢(xún)之內(nèi)連接、外連接與復(fù)合條件查詢(xún)完全解析的文章就介紹到這了,更多相關(guān)Mysql內(nèi)連接、外連接與復(fù)合條件查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解MySQL數(shù)據(jù)庫(kù)--多表查詢(xún)--內(nèi)連接,外連接,子查詢(xún),相關(guān)子查詢(xún)
- MySQL多表查詢(xún)內(nèi)連接外連接詳解(使用join、left?join、right?join和full?join)
- Mysql內(nèi)連接與外連接的區(qū)別詳解
- 詳解MySQL的內(nèi)連接和外連接
- MySQL內(nèi)連接和外連接及七種SQL?JOINS的實(shí)現(xiàn)
- mysql外連接與內(nèi)連接查詢(xún)的不同之處
- 詳解MySql自連接,外連接,內(nèi)連接?,左連接,右連接
- MySQL之表連接方式(內(nèi)連接與外連接)
- MySQL 多表連接查詢(xún)實(shí)戰(zhàn)指南:內(nèi)連接 + 外連接
- MySQL數(shù)據(jù)庫(kù)表的內(nèi)連接和外連接示例詳解
相關(guān)文章
MySQL?INSERT語(yǔ)句實(shí)現(xiàn)當(dāng)記錄不存在時(shí)插入的幾種方法
MySQL的INSERT語(yǔ)句是用于向數(shù)據(jù)庫(kù)表中插入新記錄的關(guān)鍵命令,下面這篇文章主要介紹了MySQL?INSERT語(yǔ)句實(shí)現(xiàn)當(dāng)記錄不存在時(shí)插入的幾種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要區(qū)別整理
這篇文章主要介紹了MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要區(qū)別整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-08-08
MySQL中TINYINT、INT 和 BIGINT的具體使用
MySQL提供了多種整數(shù)類(lèi)型來(lái)滿(mǎn)足不同的數(shù)據(jù)存儲(chǔ)需求,本文主要介紹了MySQL中TINYINT、INT 和 BIGINT的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
Sphinx/MySQL 協(xié)議支持與SphinxQL應(yīng)用實(shí)例
Sphinx/MySQL 協(xié)議支持與SphinxQL應(yīng)用例子,供大家學(xué)習(xí)參考2013-02-02
MYSQL SET類(lèi)型字段的SQL操作知識(shí)介紹
本篇文章是對(duì)MYSQL中SET類(lèi)型字段的SQL操作知識(shí)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
MySQL FIND_IN_SET 函數(shù)實(shí)戰(zhàn)實(shí)例
FIND_IN_SET是MySQL處理分隔字符串的函數(shù),用于判斷字符串是否存在于列表中,返回位置或0,適用于標(biāo)簽、分類(lèi)等多值場(chǎng)景,但無(wú)法使用索引,性能較差,建議結(jié)合替代方案或優(yōu)化設(shè)計(jì),注意大小寫(xiě)敏感和空值處理問(wèn)題,對(duì)mysql find_in_set函數(shù)感興趣的朋友一起看看吧2025-07-07
MySQL數(shù)據(jù)庫(kù)的事務(wù)和索引詳解
這篇文章主要介紹了MySql 索引和事務(wù),總結(jié)分析了mysql數(shù)據(jù)庫(kù)中關(guān)于索引和事務(wù)的概念、原理、知識(shí)點(diǎn)及相關(guān)注意事項(xiàng),需要的朋友可以參考下2021-10-10
MySQL教程徹底學(xué)懂存儲(chǔ)過(guò)程
這篇文章主要為大家介紹了MySQL系列的存儲(chǔ)過(guò)程,文中詳細(xì)的為大家解釋存儲(chǔ)過(guò)程的相關(guān)概念及用法語(yǔ)法,以及對(duì)存儲(chǔ)過(guò)程的理解解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10

