91人参与 • 2026-05-14 • Mysql
在 mysql 多表查询中,表连接是最核心、最常用的知识点,不管是业务开发还是面试,都是高频考点。这篇博客我用最通俗的语言,带你彻底搞懂内连接、左外连接、右外连接,看完直接上手写 sql。
实际业务里,数据不会只存在一张表中。比如:
emp 表dept 表stu 表,成绩存在 exam 表想同时查员工 + 部门、学生 + 成绩,就必须用表连接,把多张表按关联字段拼起来查询。
表连接本质:把多张表按关联条件组合,返回符合要求的结果集。
内连接 = 取两张表的交集只返回两张表能匹配上的数据,匹配不上的直接丢弃。
我们平时写的 from 表1,表2 where 条件,本质就是内连接。
select 字段名 from 表1 inner join 表2 on 连接条件 and 其他筛选条件;
inner join:内连接关键字on:写表与表之间的关联条件(必须有)and:额外的筛选条件需求:查询员工 smith 的名字和所属部门名称。
-- 老式写法(等价内连接) select ename, dname from emp, dept where emp.deptno = dept.deptno and ename = 'smith'; -- 标准内连接写法(推荐) select ename, dname from emp inner join dept on emp.deptno = dept.deptno and ename = 'smith';
结果:只返回 smith 及其对应部门,无匹配的数据不会出现。
外连接和内连接最大区别:会保留某张表的全部数据,即使另一张表没有匹配项,也会显示,补 null。
外连接分两种:左外连接(left join)、右外连接(right join)。
核心概念
null标准语法
select 字段名 from 表1(左表) left join 表2(右表) on 连接条件;
实战案例
先建测试表:
-- 学生表 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;
结果:
核心概念
null标准语法
select 字段名 from 表1 right join 表2(右表) on 连接条件;
实战案例
需求:显示所有成绩,哪怕没有学生对应也要显示。
select * from stu right join exam on stu.id = exam.id;
结果:
需求:列出所有部门名称 + 员工信息,包括没有员工的部门。
两种等价写法:
-- 方法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。
表格
| 连接类型 | 关键字 | 保留数据 | 适用场景 |
|---|---|---|---|
| 内连接 | inner join | 两张表的交集 | 只查匹配数据 |
| 左外连接 | left join | 左表全部数据 | 以左表为主,查全部 + 关联 |
| 右外连接 | right join | 右表全部数据 | 以右表为主,查全部 + 关联 |
简单记:
到此这篇关于一文带你彻底搞懂mysql数据库中的内外连接的文章就介绍到这了,更多相关mysql数据库内外连接内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论