最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql連接查詢(xún)之內(nèi)連接、外連接與復(fù)合條件查詢(xún)完全解析

 更新時(shí)間:2026年07月10日 10:13:15   作者:羊小蜜.  
MySQL連接查詢(xún)通過(guò)內(nèi)連接、外連接(左/右)及全連接實(shí)現(xiàn)多表數(shù)據(jù)關(guān)聯(lián),下面這篇文章主要介紹了Mysql連接查詢(xún)之內(nèi)連接、外連接與復(fù)合條件查詢(xún)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 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_idstu_nameclasssubjectscore
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_idstu_nameclasssubjectscore
1張三一班語(yǔ)文85
1張三一班數(shù)學(xué)92
2李四二班語(yǔ)文78
3王五一班數(shù)學(xué)88
4趙六三班NULLNULL

說(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_idstu_nameclasssubjectscore
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_idstu_nameclasssubjectscore
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.ONWHERE 混用:外連接中,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é)果

classstu_nametotal_score
一班張三177
一班王五88
二班李四78
三班趙六0

六、核心總結(jié)

  1. 內(nèi)連接:取交集,只顯示匹配數(shù)據(jù)
  2. 左連接:左表全顯,右表補(bǔ)空;右連接:右表全顯,左表補(bǔ)空
  3. 復(fù)合條件ON 過(guò)濾連接,WHERE 過(guò)濾結(jié)果,不可混用
  4. 避坑關(guān)鍵:必須加關(guān)聯(lián)條件,同名字段加別名,外連接慎用 WHERE 過(guò)濾
  5. 性能優(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL?INSERT語(yǔ)句實(shí)現(xiàn)當(dāng)記錄不存在時(shí)插入的幾種方法

    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ū)別整理

    這篇文章主要介紹了MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要區(qū)別整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-08-08
  • MySQL中TINYINT、INT 和 BIGINT的具體使用

    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)用實(shí)例

    Sphinx/MySQL 協(xié)議支持與SphinxQL應(yīng)用例子,供大家學(xué)習(xí)參考
    2013-02-02
  • MYSQL SET類(lèi)型字段的SQL操作知識(shí)介紹

    MYSQL SET類(lèi)型字段的SQL操作知識(shí)介紹

    本篇文章是對(duì)MYSQL中SET類(lèi)型字段的SQL操作知識(shí)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • Linux下mysql 5.6.17 安裝圖文教程

    Linux下mysql 5.6.17 安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了Linux下mysql 5.6.17 安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 為MySQL中的JSON字段設(shè)置索引的兩種方法

    為MySQL中的JSON字段設(shè)置索引的兩種方法

    MySQL在2015年中發(fā)布的5.7.8版本中首次引入了JSON數(shù)據(jù)類(lèi)型,自此,它成了一種逃離嚴(yán)格列定義的方式,可以存儲(chǔ)各種形狀和大小的JSON文檔,雖然MySQL提供了讀寫(xiě)JSON數(shù)據(jù)的函數(shù),但JSON缺失了索引功能,本文介紹了如何為MySQL中的JSON字段設(shè)置索引,需要的朋友可以參考下
    2025-09-09
  • MySQL FIND_IN_SET 函數(shù)實(shí)戰(zhàn)實(shí)例

    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數(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教程徹底學(xué)懂存儲(chǔ)過(guò)程

    這篇文章主要為大家介紹了MySQL系列的存儲(chǔ)過(guò)程,文中詳細(xì)的為大家解釋存儲(chǔ)過(guò)程的相關(guān)概念及用法語(yǔ)法,以及對(duì)存儲(chǔ)過(guò)程的理解解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評(píng)論

德钦县| 屏南县| 达孜县| 晋州市| 宜州市| 边坝县| 阿拉善盟| 绥宁县| 和平区| 封开县| 藁城市| 淮南市| 阿克苏市| 西平县| 泽库县| 文化| 大港区| 绥芬河市| 上林县| 资兴市| 周口市| 达日县| 志丹县| 藁城市| 密云县| 黄陵县| 三亚市| 德清县| 新疆| 沈阳市| 松原市| 永登县| 丹江口市| 四平市| 巩留县| 中西区| 元江| 瓮安县| 马鞍山市| 宜兴市| 迁安市|