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

