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常见坑的文章就介绍到这了,更多相关MySQL联表查询left-join内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言如何判断数据是否符合正态分布_统计学里的数据正态性检验

在前面的文章中讲过,很多模型的假设条件都是数据是服从正态分布的。这篇文章主要讲讲如何判断数据是否符合正态分布。主要分为两种方法:描述统计方法和统计检验方法。01.描述统计方法描述统计就是用描述的数字或图表来判断数据是否符合正态分布。常用的方…

php mysql html 转义字符_php, html, javascript, mysql 之间的特殊字符处理

特殊字符指在程序中有具有特殊的控制意义的字符,一般来讲各个程序语言所使用的特殊字符大部分都来源于传统的 C 语言,加上自身的扩展,便较为完整的满足了编程需求。 程序自身的转义处理能够解决自身的处理需求,问题基本上都集中…

python matplotlib_Python の Matplotlib

matplotlib是python优秀的数据可视化第三方库。matplotlib.pyplot子库可以调用全部功能,便于用户使用。绘图-plt.plot(x,y,format,**kwargs)x:x轴数据y:y轴数据format_string:控制曲线的格式字符串,颜色线条点**kwargs…

mysql 数据库还原 不齐_请教mysql数据库还原问题。

你的位置:问答吧-> 数据库-> 问题详情请教mysql数据库还原问题。50多m,能不能拆分?上传到服务器上总是超时。怎么办?[ 本帖最后由 geniux 于 2007-9-24 15:23 编辑 ]作者: geniux发布时间: 2007-09-20继续请教,现在数据库传…

python self理解_Python面向对象总结,让你快速掌握面向对象常用的用法

python等面向对象的提出是为了更好的处理和管理同属一个类别的事情,这样就可以省去多余重复的基础代码,让程序变得更加简洁和强大。对于学习编程的朋友来说,熟悉掌握面向对象是非常重要的。下面开始讲讲关于python面向对象的知识,…

mysql 查询 汇总_Mysql-Sql查询汇总

软件测试Mysql-Sql查询汇总简单查询创建students表create table students(id int not null unique primary key auto_increment,name varchar(10) not null,class varchar(10) not null,grade int)添加数据insert into students values(0,老1,1班,80);insert into students val…

pat和ccf哪个含金量高_函授和网络教育哪个好 哪个含金量高

函授和网络教育都是成人教育学习的方式,但是考生报考的时候选择哪个比较好,下面小编整理了相关信息,以供参考。一、函授好还是网络教育好其实这两种教育方式都各有各的优点,两者都是不可替代的,这两种方式对于不同阶段…

mysql各种联结的区别_mysql几种连接方式区别

mysql的几种join2017年03月19日 14:49:07 carl-zhao 阅读数:7845 标签: mysqlsqljoin 更多个人分类: MySQL版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012410733/article/details/63…

python和office_Python在office开发中的应用

Python with Excel 有几个很好的Python模块能够方便地操作Excel的数据,包括读与写,不要求本地安装Excel。例如pandas, openpyxl, xlrd, xlutils 和 pyexcel. 详情可以参考下面的介绍: https://www.datacamp.com/community/tutorials/python-e…

mysql5.7 新增参数_MySQL 5.7 新增参数

参数默认值binlog_group_commit_sync_delay0binlog_group_commit_sync_no_delay_count0binlog_transaction_dependency_history_size25000binlog_transaction_dependency_trackingCOMMIT_ORDERcheck_proxy_usersOFFdefault_authentication_pluginmysql_native_passworddefault_…

android通过用户名密码访问服务器获取信息_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...

数据库服务器通常包含着关键的数据,所以为了确保这些数据的安全和完整需要要利用访问控制。MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少(即用户不能对过多的数据具有访问权)访…

mysql 数据库 额外_Manager额外参数怎么学?mysql数据库学习

说明:主库宕机谁来接管?1. 所有从节点日志都是一致的,默认会以配置文件的顺序去选择一个新主。2. 从节点日志不一致,自动选择最接近于主库的从库3. 如果对于某节点设定了权重(candidate_master1),权重节点会优先选择。但是此节点…

mysql安全补丁如何处理_3分钟学会mysql数据库的逻辑架构原理

这篇文章主要是从mysql数据库的逻辑架构来认识掌握mysql的原理。只要是稍微有一点计算机的相关知识相信都能看明白。一、笼统的逻辑架构先给出一张逻辑架构图,这张图是让你从宏观的角度来分析认识一下。从这张图你可以获取到如下的信息:(1&am…

mysql reflush pri_Mysql Flush privileges命令的功能与使用

flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。MySQL用户数据和权限有修改后,希望在"不重启MySQL服务"的情况下直接生效,那么就需要执行这个命令。通常是在…

onclick 源码_仿照React源码流程打造90行代码的Hooks

作者:苏畅转发链接:https://mp.weixin.qq.com/s/YLSD4IojDWTPlov_RQtVAA前言你可能已经看过其它简易的Hooks实现。那么本文和其它实现有什么区别呢?本文的实现完全参照React源码的运行流程。学懂本文,去看React源码,你…

java写一个窗体并连接MySQL_大神帮忙写一个简单地java页面,连接MySQL数据库之后能够显示数据库上的数据...

展开全部用jdbc 连接mysql数据库就行了,网上搜下一大把。--记得在classpath下加入mysql 的jdbc驱动包。/*** author :来e68a84e8a2ad3231313335323631343130323136353331333337386636自互联网*/import java.sql.DriverManager;import java.sql.ResultSet…

java break 在if 中使用_java中使用国密SM4算法详解

前言上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。ps:我们既可以基…

移动web前端开发框架_移动前端开发是Web前端开发吗?

移动端开发并不是Web前端开发,但移动前端开发和web前端开发其实都属于前端开发的范围,目前前端发展的趋势就是大前端,可以说是包罗万象。但不论趋势如何发展,目前来看HTML、CSS和JavaScript依然是整个前端开发的三大基石。所以不论…

mtk一键usb驱动_三菱MRJEB驱动器报错,导致报错原因37.1参数设置范围异常?

三菱MR-JE-B驱动器报错,导致报错原因37.1参数设置范围异常?最近海蓝机电工程师们在做一个项目,做的是三菱MR-JE-B驱动器。工程师们在实操这个项目过程中遇到各种问题,其中就像驱动器报错的问题,导致报错的原因显示37,1…

mysql 上一条_mysql选择上一条、下一条数据记录

1.表数据结构选择mysql记录上一条,下一条sql语句SELECT * FROM user ORDER BY rank ASC-------------------| ID | rank | name |-------------------| 1 | 1 | admin1 || 2 | 2 | admin2 || 3 | 3 | admin3 || 4 | 4 | admin4 || 5 | 5 | admin5 || 6 | 6 | admin6…