MySQL联表查询中left-join常见问题
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了MySQL联表查询中left-join常见问题,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。概述对于中小体量的项目而言,联表查询是再常见不过的操作了,尤
千家信息网最后更新 2026年11月02日MySQL联表查询中left-join常见问题
这篇文章主要讲解了MySQL联表查询中left-join常见问题,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
概述
对于中小体量的项目而言,联表查询是再常见不过的操作了,尤其是在做报表的时候。然而校对数据的时候,您发现坑了吗?本篇文章就 mysql 常用联表查询复现常见的坑。
基础环境
建表语句
DROP TABLE IF EXISTS `role`;CREATE TABLE `role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_name` VARCHAR(50) DEFAULT NULL COMMENT '角色名', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表';insert into `role` VALUES(1, '管理员');insert into `role` VALUES(2, '总经理');insert into `role` VALUES(3, '科长');insert into `role` VALUES(4, '组长');DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_id` int(11) NOT NULL COMMENT '角色id', `user_name` VARCHAR(50) DEFAULT NULL COMMENT '用户名', `sex` int(1) DEFAULT 0 COMMENT '性别', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';insert into `user` VALUES(1, 1, 'admin', 1);insert into `user` VALUES(2, 2, '王经理', 1);insert into `user` VALUES(3, 2, '李经理', 2);insert into `user` VALUES(4, 2, '张经理', 2);insert into `user` VALUES(5, 3, '王科长', 1);insert into `user` VALUES(6, 3, '李科长', 1);insert into `user` VALUES(7, 3, '吕科长', 2);insert into `user` VALUES(8, 3, '邢科长', 1);insert into `user` VALUES(9, 4, '范组长', 2);insert into `user` VALUES(10, 4, '赵组长', 2);insert into `user` VALUES(11, 4, '姬组长', 1);
数据如下
mysql> select * from role;+----+-----------+| id | role_name |+----+-----------+| 1 | 管理员 || 2 | 总经理 || 3 | 科长 || 4 | 组长 |+----+-----------+4 rows in set (0.00 sec)mysql> select * from user;+----+---------+-----------+------+| id | role_id | user_name | sex |+----+---------+-----------+------+| 1 | 1 | admin | 1 || 2 | 2 | 王经理 | 1 || 3 | 2 | 李经理 | 2 || 4 | 2 | 张经理 | 2 || 5 | 3 | 王科长 | 1 || 6 | 3 | 李科长 | 1 || 7 | 3 | 吕科长 | 2 || 8 | 3 | 邢科长 | 1 || 9 | 4 | 范组长 | 2 || 10 | 4 | 赵组长 | 2 || 11 | 4 | 姬组长 | 1 |+----+---------+-----------+------+11 rows in set (0.00 sec)
基本业务
简单信息报表: 查询用户信息
mysql> SELECT -> id, -> user_name AS '姓名', -> ( CASE WHEN sex = 1 THEN '男' WHEN sex = 2 THEN '女' ELSE '未知' END ) AS '性别' -> FROM -> USER;+----+-----------+--------+| id | 姓名 | 性别 |+----+-----------+--------+| 1 | admin | 男 || 2 | 王经理 | 男 || 3 | 李经理 | 女 || 4 | 张经理 | 女 || 5 | 王科长 | 男 || 6 | 李科长 | 男 || 7 | 吕科长 | 女 || 8 | 邢科长 | 男 || 9 | 范组长 | 女 || 10 | 赵组长 | 女 || 11 | 姬组长 | 男 |+----+-----------+--------+
查询每个角色名称及对应人员中女性数量
mysql> SELECT -> r.id, -> r.role_name AS role, -> count( u.sex ) AS sex -> FROM -> role r -> LEFT JOIN USER u ON r.id = u.role_id -> AND u.sex = 2 -> GROUP BY -> r.role_name -> ORDER BY -> r.id ASC;+----+-----------+-----+| id | role | sex |+----+-----------+-----+| 1 | 管理员 | 0 || 2 | 总经理 | 2 || 3 | 科长 | 1 || 4 | 组长 | 2 |+----+-----------+-----+4 rows in set (0.00 sec)
假如我们把性别过滤的条件改为 where 操作结果会怎么样呢?
mysql> SELECT -> r.id, -> r.role_name AS role, -> count( u.sex ) AS sex -> FROM -> role r -> LEFT JOIN USER u ON r.id = u.role_id -> WHERE -> u.sex = 2 -> GROUP BY -> r.role_name -> ORDER BY -> r.id ASC;+----+-----------+-----+| id | role | sex |+----+-----------+-----+| 2 | 总经理 | 2 || 3 | 科长 | 1 || 4 | 组长 | 2 |+----+-----------+-----+3 rows in set (0.00 sec)
这里可以看到角色数据不完整了。
找出角色为总经理的员工数量
mysql> SELECT -> r.id, -> r.role_name AS role, -> count( u.sex ) AS sex -> FROM -> role r -> LEFT JOIN USER u ON r.id = u.role_id -> WHERE -> r.role_name = '总经理' -> GROUP BY -> r.role_name -> ORDER BY -> r.id ASC;+----+-----------+-----+| id | role | sex |+----+-----------+-----+| 2 | 总经理 | 3 |+----+-----------+-----+1 row in set (0.00 sec)
同样将过滤条件由 where 改为 on
mysql> SELECT -> r.id, -> r.role_name AS role, -> count( u.sex ) AS sex -> FROM -> role r -> LEFT JOIN USER u ON r.id = u.role_id -> AND r.role_name = '总经理' -> GROUP BY -> r.role_name -> ORDER BY -> r.id ASC;+----+-----------+-----+| id | role | sex |+----+-----------+-----+| 1 | 管理员 | 0 || 2 | 总经理 | 3 || 3 | 科长 | 0 || 4 | 组长 | 0 |+----+-----------+-----+4 rows in set (0.00 sec)
这里可以看到数据多余了
总结
在 left join 语句中,左表过滤必须放 where 条件中,右表过滤必须放 on 条件中,这样结果才能不多不少,刚刚好。
看完上述内容,是不是对MySQL联表查询中left-join常见问题有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。
科长
组长
总经理
经理
查询
角色
常见
性别
数据
条件
管理员
管理
内容
用户
常见问题
问题
信息
姓名
报表
数量
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技未来
艾特科技互联网
百单互联网科技有限公司
广州互联网络科技有限公司
融势互联网科技
友谊互联网络科技
互联网科技logo
润盈互联网科技
撒么互联网科技公司
亿人帮互联网科技
四川狮子座互联网科技
字节跳动和互联网科技
顶级互联网科技成果有哪些
呼和浩特新华互联网科技学院
用友工业互联网科技发展
明优互联网科技有限公司
保险科技服务互联网营销体系
上海同邻互联网科技有限公司规模
杭州科技互联网公司有哪些
北京瑞云互联网科技有限公司
天津市摩尔互联网科技
鸠鸠互联网科技
唐信互联网科技 大连
赫美联合互联网科技
互联网实体化科技化
温州喔噻互联网科技有限公司
移动互联网科技股
互联网科技的全部知识
众联互联网络科技
现代科技的标志之一的互联网