前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL中left join的几个SQL对比

MySQL中left join的几个SQL对比

作者头像
jeanron100
发布于 2020-04-01 02:47:29
发布于 2020-04-01 02:47:29
1K00
代码可运行
举报
运行总次数:0
代码可运行

读完需要9分钟

速读仅需7分钟

对于很多同学来说,写SQL时的表关联看起来是一件很简单的事情,知道逻辑,有预期的结果,好像没什么特别要注意的,今天在写一条SQL逻辑的时候,觉得对于left join的部分还是存在一些误解。

我举一个小例子来说明。

为了演示方便,我用两张表来说明,test1和test2.

初始化的部分如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table test1(id int primary key,name varchar(30));
create table test2(id int primary key,name varchar(30));

写入一些简单的数据,其中name='bb'的部分需要注意。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into test1 values(1,'aa'),(2,'bb'),(3,'cc'),(4,'bb'),(5,'bb');
insert into test2 values(2,'bb'),(3,'cc'),(4,'bb'),(6,'dd');

表中的数据如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select *from test1;
+----+------+
| id | name |
+----+------+
|  1 | aa   |
|  2 | bb   |
|  3 | cc   |
|  4 | bb   |
|  5 | bb   |
+----+------+
5 rows in set (0.00 sec)


mysql> select *from test2;
+----+------+
| id | name |
+----+------+
|  2 | bb   |
|  3 | cc   |
|  4 | bb   |
|  6 | dd   |
+----+------+
4 rows in set (0.00 sec)

我们写一个条基本的left join的SQL,这个时候我们使用name='bb'来作为过滤条件,id作为关联条件。

如果按照id为关联条件,最后使用了and的方式,查询的结果其实和本来的预期是有差距的,即test1显示了全部的数据记录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select t1.id,t1.name from test1 t1 left join test2 t2 on t1.id=t2.id and t1.name='bb'; 
+----+------+
| id | name |
+----+------+
|  1 | aa   |
|  2 | bb   |
|  3 | cc   |
|  4 | bb   |
|  5 | bb   |
+----+------+
5 rows in set (0.00 sec)

如果我们把最后的on改为where ,情况就大大不同的,输出了name='bb'的3条记录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select t1.id,t1.name from test1 t1 left join test2 t2 on t1.id=t2.id where  t1.name='bb'; 
+----+------+
| id | name |
+----+------+
|  2 | bb   |
|  4 | bb   |
|  5 | bb   |
+----+------+
3 rows in set (0.00 sec)

当然我们需要继续扩展下,开始摆弄这条SQL

基于name列来关联,name='bb'过滤,会发现这种情况看起来有些失控,输出结果是笛卡尔积。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select t1.id,t1.name from test1 t1 left join test2 t2 on t1.name=t2.name and t1.name='bb'; 
+----+------+
| id | name |
+----+------+
|  2 | bb   |
|  4 | bb   |
|  5 | bb   |
|  2 | bb   |
|  4 | bb   |
|  5 | bb   |
|  1 | aa   |
|  3 | cc   |
+----+------+
8 rows in set (0.00 sec)

如果把原本的on条件改为where,情况有所好转,不过还是对name='bb'的子集重新做了关联。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select t1.id,t1.name from test1 t1 left join test2 t2 on t1.name=t2.name where t1.name='bb';     
+----+------+
| id | name |
+----+------+
|  2 | bb   |
|  4 | bb   |
|  5 | bb   |
|  2 | bb   |
|  4 | bb   |
|  5 | bb   |
+----+------+
6 rows in set (0.00 sec)

所以在多表关联中的绑定字段是很重要的。

我们继续做多个字段的关联,看看优化器怎么解析,在where条件中再进行id列的映射。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select t1.id,t1.name from test1 t1 left join test2 t2 on t1.name=t2.name where t1.name='bb' and t1.id=t2.id;
+----+------+
| id | name |
+----+------+
|  2 | bb   |
|  4 | bb   |
+----+------+
2 rows in set (0.00 sec)

这个时候的效果是和inner join是类似的。

如果继续进行改造,改造为and的条件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql>  select t1.id,t1.name from test1 t1 left join test2 t2 on t1.name=t2.name and t1.id=t2.id and t1.name='bb';
+----+------+
| id | name |
+----+------+
|  2 | bb   |
|  4 | bb   |
|  1 | aa   |
|  3 | cc   |
|  5 | bb   |
+----+------+
5 rows in set (0.00 sec)

继续改造。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql>  select t1.id,t1.name from test1 t1 left join test2 t2 on t1.name=t2.name and t1.id=t2.id where  t1.name='bb';
+----+------+
| id | name |
+----+------+
|  2 | bb   |
|  4 | bb   |
|  5 | bb   |
+----+------+
3 rows in set (0.00 sec)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
MongoDB的安全和权限控制(二)
MongoDB提供了内置的数据库审计功能,可以记录用户在MongoDB上的所有操作,包括对集合的查询、更新、删除等操作。管理员可以使用审计日志来监控数据库的访问,识别潜在的安全问题,并采取必要的措施来保护数据。以下是一个启用审计日志的示例:
堕落飞鸟
2023/05/09
4000
​Harbor制品仓库的访问控制(2)
(本文作者何威威系Harbor开源项目贡献者,本文节选自《Harbor权威指南》一书。)
Henry Zhang
2021/03/30
5.5K0
​Harbor制品仓库的访问控制(2)
KPaaS洞察|统一管理模式下跨系统用户权限修改流程详解
首先需要明确权限变更的原因,这通常是由业务需求驱动的。例如,员工岗位调动是常见的情况,当员工从一个部门调到另一个部门,如从市场部调到销售部,其在各个业务系统中的权限需要相应调整,以适应新的工作职责。
KPaaS集成扩展
2024/11/13
2630
KPaaS洞察|统一管理模式下跨系统用户权限修改流程详解
等保2.0标准个人解读(一)
从事安全合规工作多年,经常会有同事或朋友过来问我一些标准中的点,比如后端实施的一些工程师和项目经理比较关心的是测评中要求项的测评方法和测评点、如何给客户解释此项,如何整改才算合规;也有前端销售和售前,问我能不能对合规的内容详细给他们讲讲,最好结合产品和服务,或者培训一下,他们关心的是如何将合规的东西结合产品或服务灌输给客户,因为几年来国家对网络安全的要求越来越严格,企业对安全也是越来越重视,不管是为了应付监管还是为了保障业务,安全合规可以说是企业安全的基线,必须要做没有商量。所以,决定结合即将实施的等保2.0(以下简称“等2”或“新标准”)标准的通用部分,做一下分析,给出一些个人建议,以供前端和后端人员参考。
FB客服
2019/08/16
4.1K0
等保2.0标准个人解读(一)
KPaaS洞察|异构系统中用户角色与权限分类及管理解决方案
多个异构系统的使用已经成为企业常态。每个系统通常有自己独立的用户角色和权限设置,导致权限管理复杂且容易出现冲突。如何在多个异构系统中统一、有效地进行用户角色和权限管理,已成为企业保障数据安全和提升管理效率的关键挑战。通过集中式权限管理平台和标准化的角色权限分配策略,企业能够简化管理流程,实现各系统间的权限同步与安全合规。
KPaaS集成扩展
2024/11/12
2951
KPaaS洞察|异构系统中用户角色与权限分类及管理解决方案
大家心心念念的权限管理功能,这次安排上了!
mall项目的权限管理功能发布啦!权限管理作为后台管理系统的必要功能,mall项目之前的权限管理并不完善。最近我对原先的权限管理进行了重新设计,打造了一套切实可用的权限管理功能。 功能清单 菜单管理:可以实现对后台管理系统左侧菜单的管理,支持更换图标、更换名称、控制菜单显示和排序; 资源管理:实现了基于访问路径的后台动态权限控制,控制的权限可以精确到接口级别; 角色管理:可以自定义角色,并为角色分配菜单和资源; 后台用户管理:可以对后台用户进行管理并分配角色,支持分配多个角色。 功能介绍 接下了我们对权
macrozheng
2020/02/26
7090
大家心心念念的权限管理功能,这次安排上了!
Confluence 6 管理和恢复空间管理权限
可能有些空间的空间管理权限被系统的超级管理删除掉了。这样的空间是没有任何空间管理员的,用户和用户组都不能对空间进行管理。只有 Confluence 管理员权限的用户可以删除一个空间的空间管理员。
HoneyMoose
2019/01/30
9190
Confluence 6 管理和恢复空间管理权限
【基础概念】YashanDB访问控制
角色包含权限集,通过角色能有效权限管理,管理员对用户只需关注其角色,对角色只需关注其权限集。
用户11498166
2025/02/25
810
linux登录root用户密码_centos7找回root密码
Linux 系统是一个多用户多任务的操作系统,每一个想要使用系统资源的用户,都需要向系统管理员申请一个账号,之后以这个账号身份进入系统。
全栈程序员站长
2022/11/10
12.4K0
linux登录root用户密码_centos7找回root密码
OA系统权限管理设计
任何系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统添加亮点。
星哥玩云
2022/06/30
2.5K0
OA系统权限管理设计
数据产品权限管理设计原则(一)
数据产品除了页面、功能权限外,还要多一层数据的权限,权限粒度经常会到指标和维度,比如针对销售人员设计的销售业绩统计报表,系统层面会把不同销售的数据在一个页面内展示,通过权限管理来控制能看到负责区域或者商家的数据,这个时候,对于同一个交易额的指标,就要控制到省份/城市,或者销售人员维度。同样,不同用户群体能够看到的指标可能也是不一样的,比如管理层要看到能够衡量业务整体表现情况的流量、订单、成本、服务等各个视角的指标,而某一具体的业务人员,如客服,原则上只应看到服务相关的指标。
数据干饭人
2022/07/01
2.2K0
数据产品权限管理设计原则(一)
Jenkins权限控制
Role Strategy Plugin插件可以对构建的项目进行授权管理,让不同的用户管理不同的项目,将测试和生产环境分开。 1、插件安装 插件名称:Role-based Authorization Strategy
似水的流年
2019/12/07
1.3K0
HR : "你的测试思维不行",不太符合我企岗位要求!
后期文章应该不会日更,更多的是出精品原创,抽空码字佛系更新,尽量做到一周1-2篇,给大家分享测试所学心得
测试小兵
2021/01/20
4060
Docker部署Jenkins
Jenkins是开源CI&CD软件领导者,提供超过1000个插件来支持构建、部署、自动化,满足任何项目的需要。我们可以用Jenkins来构建和部署我们的项目,比如说从我们的代码仓库获取代码,然后将我们的代码打包成可执行的文件,之后通过远程的ssh工具执行脚本来运行我们的项目。
星哥玩云
2022/07/29
9140
Docker部署Jenkins
分享一套OA协同办公系统
OA协同办公系统是高效工作流平台基础上,开发带有控制功能的OA办公系统、标准版功能模块:1、个人事务;2、工作流;3、行政;4、信息管理;5、人力资源;6、公文档案管理;7、系统管理。采用MYSQL数据库
程序源代码
2018/09/21
10.1K1
Linux系统的用户和用户组管理
用户在系统中是分角色的,在Linux系统中,由于角色的不同,权限和所完成的任务也不同; 值得注意的是用户的角色是通过UID和GID识别的; 特别是UID,在运维工作中,一个UID是唯一标识一个系统用户的账号。
码客说
2019/10/21
3.3K0
【Jenkins系列】基于LDAP&&Role-based Authorization Strategy实现Jenkins团队权限管理
jenkins 默认可以手动添加用户,由于简单不做解释;这里重点说下企业内部使用LDAP来实现用户的统一管理,也就是说无须再次创建用户
DevOps在路上
2023/05/16
1K0
【Jenkins系列】基于LDAP&&Role-based Authorization Strategy实现Jenkins团队权限管理
Jenkins实践文档-管理Jenkins(用户、凭据、权限)
凭据参数、字符参数、密码参数、布尔值参数、文件参数、文本参数、运行时参数、选项参数
DevOps云学堂
2019/10/17
4K0
CodeWave系列:8.CodeWave 智能开发平台 公司官网及项目管理实战
通过前面七节的学习,相信同学们已经对CodeWave已有有了一个整体的认识了,准备跃跃欲试,小试牛刀了,今天我们学习俩个项目的实战,通过俩个项目的实战让大家能够真正的通过自己的双手来完成,详细通过本节的学习,你会对CodeWave有一个全新的认识。今天我们学习俩个项目,一个公司官网的搭建,还有一个项目后台管理软件的搭建。
Freedom123
2024/03/29
2140
CodeWave系列:8.CodeWave 智能开发平台 公司官网及项目管理实战
等保2.0安全管理中心要求解读
今年5月,随着《信息安全技术网络安全等级保护基本要求》(GBT22239-2019)的公布,宣告等保2.0时代正式开启,并将于2019年12月1日正式实施。也就意味着,到今年年底,所有的信息系统,只要对外的,就要做定级备案,对于重要系统同时还要定为关键信息基础设施,在等保之上还要满足《关键信息基础设施安全保护条例》的要求。而等保中新增的个人信息保护中,也要满足《互联网个人信息安全保护指引》的要求,对于漏洞也应参考《网络安全漏洞管理规定》要求。
FB客服
2019/07/17
5.5K0
相关推荐
MongoDB的安全和权限控制(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档