MySQL多表查询实战:隐式/显式内连接与外连接详解

键盘旁的猫
键盘旁的猫
发布时间:2026-10-15 | 4人浏览过
原创

本文通过MySQL emp员工表、dept部门表与salgrade薪资等级表的具体案例,详解多表查询的核心语法。内容涵盖隐式内连接、显式内连接(INNER JOIN)、左外连接(LEFT JOIN)的实现方式,以及如何利用薪资区间条件完成复杂的数据关联查询,帮助开发者掌握实际开发中的多表数据处理技巧。

数据环境准备

在进行多表查询之前,首先创建一个用于模拟薪资等级的测试表 salgrade。该表包含薪资等级编号、最低薪资和最高薪资三个字段。

create table salgrade(
grade int,
losal int,
hisal int
) comment '薪资等级表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

本案例主要涉及三张数据表:emp(员工表)、dept(部门表)和上述创建的 salgrade(薪资等级表)。

常见多表查询操作

第1步:使用隐式内连接查询员工基本信息

目的: 获取员工的姓名、年龄、职位及其所属部门名称。
逻辑: 通过在 WHERE 子句中指定两表的关联条件 emp.dept_id = dept.id 来实现隐式内连接。这种方式兼容性好,但建议在大型项目中使用显式连接以提高可读性。

select e.name , e.age , e.job , d.name 
from emp e , dept d 
where e.dept_id = d.id;

第2步:使用显式内连接进行条件筛选

目的: 在获取员工及部门信息的基础上,进一步筛选出年龄小于30岁的员工。
逻辑: 采用标准的 INNER JOIN ... ON 语法,结构更清晰,便于添加复杂的过滤条件。

select e.name , e.age , e.job , d.name 
from emp e 
inner join dept d on e.dept_id = d.id 
where e.age < 30;

执行结果如下图所示:

第3步:去重查询拥有员工的部门

目的: 统计实际有员工在职的部门ID和名称,避免重复显示。
逻辑: 在查询结果中使用 DISTINCT 关键字去除由于多对一关系可能产生的重复部门记录。

select distinct d.id , d.name 
from emp e , dept d 
where e.dept_id = d.id;

第4步:使用左外连接处理无部门员工

目的: 查询所有年龄大于40岁的员工及其部门信息;特别注意:即使员工未分配部门(dept_id为空),也需要将其展示出来。
逻辑: 使用 LEFT JOIN 确保左侧表(emp)的所有记录都能被保留,即使右侧表(dept)中没有匹配的记录。此时部门名称字段将返回 NULL。

select e.* , d.name 
from emp e 
left join dept d on e.dept_id = d.id 
where e.age > 40;

第5步:基于区间条件的薪资等级查询

目的: 为每位员工匹配其所属的薪资等级,并显示该等级的薪资范围。
逻辑: 由于 emp.salary 是一个单值,而 salgrade 是区间范围,需要通过比较大小或 BETWEEN 运算符来建立关联。这里提供两种写法:

-- 方式一:使用大于等于和小于等于
select e.* , s.grade , s.losal, s.hisal 
from emp e , salgrade s 
where e.salary >= s.losal 
  and e.salary <= s.hisal;

-- 方式二:使用 BETWEEN ... AND 语法
select e.* , s.grade , s.losal, s.hisal 
from emp e , salgrade s 
where e.salary between s.losal and s.hisal;

以上就是MySQL基础多表查询的详细内容,更多关于MySQL多表查询的教程资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表