一文帶你徹底搞懂MySQL數(shù)據(jù)庫(kù)中的內(nèi)外連接
在 MySQL 多表查詢中,表連接是最核心、最常用的知識(shí)點(diǎn),不管是業(yè)務(wù)開發(fā)還是面試,都是高頻考點(diǎn)。這篇博客我用最通俗的語(yǔ)言,帶你徹底搞懂內(nèi)連接、左外連接、右外連接,看完直接上手寫 SQL。
一、先搞懂:為什么需要表連接?
實(shí)際業(yè)務(wù)里,數(shù)據(jù)不會(huì)只存在一張表中。比如:
- 員工信息存在
emp表 - 部門信息存在
dept表 - 學(xué)生信息存在
stu表,成績(jī)存在exam表
想同時(shí)查員工 + 部門、學(xué)生 + 成績(jī),就必須用表連接,把多張表按關(guān)聯(lián)字段拼起來(lái)查詢。
表連接本質(zhì):把多張表按關(guān)聯(lián)條件組合,返回符合要求的結(jié)果集。
二、內(nèi)連接(INNER JOIN):只保留匹配的數(shù)據(jù)
1. 核心概念
內(nèi)連接 = 取兩張表的交集只返回兩張表能匹配上的數(shù)據(jù),匹配不上的直接丟棄。
我們平時(shí)寫的 from 表1,表2 where 條件,本質(zhì)就是內(nèi)連接。
2. 標(biāo)準(zhǔn)語(yǔ)法
SELECT 字段名 FROM 表1 INNER JOIN 表2 ON 連接條件 AND 其他篩選條件;
INNER JOIN:內(nèi)連接關(guān)鍵字ON:寫表與表之間的關(guān)聯(lián)條件(必須有)AND:額外的篩選條件
3. 實(shí)戰(zhàn)案例
需求:查詢員工 SMITH 的名字和所屬部門名稱。
-- 老式寫法(等價(jià)內(nèi)連接) SELECT ename, dname FROM emp, dept WHERE emp.deptno = dept.deptno AND ename = 'SMITH'; -- 標(biāo)準(zhǔn)內(nèi)連接寫法(推薦) SELECT ename, dname FROM emp INNER JOIN dept ON emp.deptno = dept.deptno AND ename = 'SMITH';
結(jié)果:只返回 SMITH 及其對(duì)應(yīng)部門,無(wú)匹配的數(shù)據(jù)不會(huì)出現(xiàn)。
三、外連接:保留 “不匹配” 的數(shù)據(jù)
外連接和內(nèi)連接最大區(qū)別:會(huì)保留某張表的全部數(shù)據(jù),即使另一張表沒(méi)有匹配項(xiàng),也會(huì)顯示,補(bǔ) NULL。
外連接分兩種:左外連接(LEFT JOIN)、右外連接(RIGHT JOIN)。
1. 左外連接(LEFT JOIN):左邊表全顯示
核心概念
- 左表完全顯示
- 右表只顯示匹配上的數(shù)據(jù)
- 匹配不上 → 右表字段補(bǔ)
NULL
標(biāo)準(zhǔn)語(yǔ)法
SELECT 字段名 FROM 表1(左表) LEFT JOIN 表2(右表) ON 連接條件;
實(shí)戰(zhàn)案例
先建測(cè)試表:
-- 學(xué)生表 CREATE TABLE stu (id INT, name VARCHAR(30)); INSERT INTO stu VALUES(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono'); -- 成績(jī)表 CREATE TABLE exam (id INT, grade INT); INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);
需求:查詢所有學(xué)生的成績(jī),沒(méi)成績(jī)的學(xué)生也要顯示。
SELECT * FROM stu LEFT JOIN exam ON stu.id = exam.id;
結(jié)果:
- jack、tom:有成績(jī),正常顯示
- kity、nono:無(wú)成績(jī),成績(jī)字段顯示 NULL
- 成績(jī)表 11 號(hào):不匹配學(xué)生,不顯示
2. 右外連接(RIGHT JOIN):右邊表全顯示
核心概念
- 右表完全顯示
- 左表只顯示匹配上的數(shù)據(jù)
- 匹配不上 → 左表字段補(bǔ)
NULL
標(biāo)準(zhǔn)語(yǔ)法
SELECT 字段名 FROM 表1 RIGHT JOIN 表2(右表) ON 連接條件;
實(shí)戰(zhàn)案例
需求:顯示所有成績(jī),哪怕沒(méi)有學(xué)生對(duì)應(yīng)也要顯示。
SELECT * FROM stu RIGHT JOIN exam ON stu.id = exam.id;
結(jié)果:
- 成績(jī) 1、2、11 全部顯示
- 11 號(hào)成績(jī)無(wú)匹配學(xué)生,學(xué)生字段補(bǔ) NULL
四、高頻練習(xí):部門 + 員工(經(jīng)典面試題)
需求:列出所有部門名稱 + 員工信息,包括沒(méi)有員工的部門。
兩種等價(jià)寫法:
-- 方法1:部門左連接員工(推薦) SELECT d.dname, e.* FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno; -- 方法2:?jiǎn)T工右連接部門 SELECT d.dname, e.* FROM emp e RIGHT JOIN dept d ON d.deptno = e.deptno;
效果:所有部門都顯示,沒(méi)員工的部門,員工字段為 NULL。
五、一張圖總結(jié):內(nèi)連接 vs 左 / 右連接
表格
| 連接類型 | 關(guān)鍵字 | 保留數(shù)據(jù) | 適用場(chǎng)景 |
|---|---|---|---|
| 內(nèi)連接 | INNER JOIN | 兩張表的交集 | 只查匹配數(shù)據(jù) |
| 左外連接 | LEFT JOIN | 左表全部數(shù)據(jù) | 以左表為主,查全部 + 關(guān)聯(lián) |
| 右外連接 | RIGHT JOIN | 右表全部數(shù)據(jù) | 以右表為主,查全部 + 關(guān)聯(lián) |
簡(jiǎn)單記:
- 要交集 → 內(nèi)連接
- 要某張表全量數(shù)據(jù) → 左 / 右連接
- 左連接 = 左邊全顯;右連接 = 右邊全顯
到此這篇關(guān)于一文帶你徹底搞懂MySQL數(shù)據(jù)庫(kù)中的內(nèi)外連接的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫(kù)內(nèi)外連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sql server自動(dòng)編號(hào)的三種方法
自增列是最簡(jiǎn)單和常見的方法,適用于大多數(shù)情況,本文介紹了SQL Server中三種常見的自動(dòng)編號(hào)方法:自增列、序列和觸發(fā)器,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
mysql數(shù)據(jù)庫(kù)表增添字段,刪除字段,修改字段的排列等操作
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)表增添字段,刪除字段,修改字段的排列等操作,修改表指的是修改數(shù)據(jù)庫(kù)之后中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu)2022-07-07
MySQL多個(gè)字段拼接去重的實(shí)現(xiàn)示例
在MySQL中,我們經(jīng)常會(huì)遇到需要將多個(gè)字段進(jìn)行拼接并去重的情況,本文就來(lái)介紹一下MySQL多個(gè)字段拼接去重的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
mysql導(dǎo)入sql文件常用的方法及適用場(chǎng)景
在日常學(xué)習(xí)和工作,難免不了使用Mysql數(shù)據(jù)庫(kù),有時(shí)候需要導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù),或者其中的數(shù)據(jù)表,這篇文章主要介紹了mysql導(dǎo)入sql文件常用的方法及適用場(chǎng)景,需要的朋友可以參考下2025-08-08
詳解在Windows環(huán)境下訪問(wèn)linux虛擬機(jī)中MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了如何Windows環(huán)境下訪問(wèn)linux虛擬機(jī)中MySQL數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
從MySQL的源碼剖析Innodb buffer的命中率計(jì)算
這篇文章主要介紹了從MySQL的源碼剖析Innodb buffer的命中率計(jì)算,作者結(jié)合C語(yǔ)言寫的算法來(lái)分析innodb buffer hit Ratios,需要的朋友可以參考下2015-05-05
Windows下MySQL?8.0.29?安裝和刪除圖文教程
這篇文章主要為大家詳細(xì)介紹了Windows下MySQL?8.0.29?安裝和刪除圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程
這篇文章主要介紹了CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程,使用RedHat系的Linux系統(tǒng)為環(huán)境的都可以借鑒,需要的朋友可以參考下2015-12-12

