🦄 个人主页 : 小米里的大麦-CSDN博客
🎏 所属专栏 : MySQL_小米里的大麦的博客-CSDN博客
🎁 GitHub主页 : 小米里的大麦的 GitHub

文章目录
- 表的内连和外连
-
- [1. 内连接(INNER JOIN)](#1. 内连接(INNER JOIN))
- [2. 外连接(OUTER JOIN)](#2. 外连接(OUTER JOIN))
-
- [1. 左外连接(LEFT JOIN / LEFT OUTER JOIN)](#1. 左外连接(LEFT JOIN / LEFT OUTER JOIN))
- [2. 右外连接(RIGHT JOIN / RIGHT OUTER JOIN,了解)](#2. 右外连接(RIGHT JOIN / RIGHT OUTER JOIN,了解))
- [3. 小结](#3. 小结)
- 共勉
表的内连和外连
多表查询时,数据怎么凑在一起看,就是连接。
- 内连接(INNER JOIN) → 只保留匹配上的
- 外连接(OUTER JOIN) → 保留一边,不管另一边有没有匹配
1. 内连接(INNER JOIN)
只显示 两个表都有匹配的行(交集),没匹配的行丢掉。示例场景:查"下了单的用户",没下单的不要。
基本语法:
sql
SELECT a.列, b.列
FROM 表1 a
INNER JOIN 表2 b
ON a.关联列 = b.关联列;
sql
# 只有有部门的员工显示,OPERATIONS 部门不出现
mysql> select e.ename, d.dname from emp e inner join dept d on e.deptno=d.deptno;
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| JONES | RESEARCH |
| MARTIN | SALES |
| BLAKE | SALES |
| CLARK | ACCOUNTING |
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | SALES |
| ADAMS | RESEARCH |
| JAMES | SALES |
| FORD | RESEARCH |
| MILLER | ACCOUNTING |
+--------+------------+
# 显示SMITH的名字和部门名称
mysql> select e.ename, d.dname # 只要这两列
-> from emp e # 员工表
-> inner join dept d # 关联部门表
-> on e.deptno=d.deptno # 连接条件:部门号得一样
-> and e.ename='SMITH'; # 过滤条件:只要 SMITH
+-------+----------+
| ename | dname |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
2. 外连接(OUTER JOIN)
- 左连接 (LEFT JOIN) : 左边表数据全保留,右边对不上就填 NULL(左为主,右为辅)。场景示例:查"所有用户及其订单",没下单的用户也要显示。
- 右连接 (RIGHT JOIN) : 右边表数据全保留,但是几乎没人用,建议/一般是: 直接把表顺序换一下,写成左连接,脑子不累。
1. 左外连接(LEFT JOIN / LEFT OUTER JOIN)
保留 左表所有行 ,右表匹配不上就显示 NULL。基本语法:
sql
SELECT a.列, b.列
FROM 表1 a
LEFT JOIN 表2 b
ON a.关联列 = b.关联列;
sql
# 所有部门都显示,没人的部门 ename 为 NULL
mysql> select d.dname, e.ename from dept d left join emp e on d.deptno=e.deptno;
+------------+--------+
| dname | ename |
+------------+--------+
| ACCOUNTING | MILLER |
| ACCOUNTING | KING |
| ACCOUNTING | CLARK |
| RESEARCH | FORD |
| RESEARCH | ADAMS |
| RESEARCH | SCOTT |
| RESEARCH | JONES |
| RESEARCH | SMITH |
| SALES | JAMES |
| SALES | TURNER |
| SALES | BLAKE |
| SALES | MARTIN |
| SALES | WARD |
| SALES | ALLEN |
| OPERATIONS | NULL |
+------------+--------+
2. 右外连接(RIGHT JOIN / RIGHT OUTER JOIN,了解)
保留 右表所有行 ,左表匹配不上显示 NULL。基本语法:
sql
SELECT a.列, b.列
FROM 表1 a
RIGHT JOIN 表2 b
ON a.关联列 = b.关联列;
sql
# 效果同上左连接,只是表顺序换了
mysql> select d.dname, e.ename from emp e right join dept d on d.deptno=e.deptno;
+------------+--------+
| dname | ename |
+------------+--------+
| ACCOUNTING | MILLER |
| ACCOUNTING | KING |
| ACCOUNTING | CLARK |
| RESEARCH | FORD |
| RESEARCH | ADAMS |
| RESEARCH | SCOTT |
| RESEARCH | JONES |
| RESEARCH | SMITH |
| SALES | JAMES |
| SALES | TURNER |
| SALES | BLAKE |
| SALES | MARTIN |
| SALES | WARD |
| SALES | ALLEN |
| OPERATIONS | NULL |
+------------+--------+
3. 小结
| 类型 | 谁保留 | 谁可能 NULL |
|---|---|---|
| INNER JOIN | 匹配的行 | 都匹配不上就丢掉 |
| LEFT JOIN | 左表全保 | 右表匹配不上 → NULL |
| RIGHT JOIN | 右表全保 | 左表匹配不上 → NULL |
共勉

