MySQL多表查询实战:隐式/显式内连接与外连接详解
本文通过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多表查询的教程资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













