MySQL联表查询中left-join常见问题
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要讲解了MySQL联表查询中left-join常见问题,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。概述对于中小体量的项目而言,联表查询是再常见不过的操作了,尤
千家信息网最后更新 2025年01月23日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安全错误
数据库的锁怎样保障安全
有线宽带用什么服务器
淮南企业管理软件开发公司
王珊数据库第5版课后答案
网络安全评估一年几次
软件开发工作室起名字
网络安全培训什么
学生网络文明与网络安全
如何删除数据库所创建的文件
优似腾软件开发公司
丹江口软件开发
怎么进入数据库的方法
ps4 怎么传输数据库
医用软件和网络技术专业好吗
国外菌种数据库
数据库字符截取字符串
多个数据库怎么同步
服务器安全狗 小红伞引擎
网络安全企业金盾股份
网络安全溯源取证方法
哪些网络技术可以实现在线学习
新版mimic数据库的注册
以下不属于数据库软件的是
服务器管理口ip怎么查看
和平精英最强服务器的刷新点
广西学习网络安全要怎么学
光纤服务器天津云空间
网络安全主要侧重点有哪些
中国科研机构数据库
深圳市北斗产业互联网科技
jdbc 多数据库