left jon连接查询踩坑记
项目开发中经常会使用到多张表进行关联查询,比如left join关联查询。
如果有一张表A和一张表B,查询语句 SELECT a.*,b.name from A a left join B b
On a.id = b.id 表示的含义的就是取A表独有的数据和A表和和B表共有的数据。

如上图所示,主表是A表,用A表去左关联查询B表,正常情况下会返回A表
的所有数据,不管这些数据在B表中是否存在。
自己在写SQL语句的时候,突然发现查询条件的位置不一样,导致查询结果
出现很大的差异,让我很是疑惑。下面就来复现这个问题,首先创建两张表A和B.
表A插入3条数据,没有删除,is_deleted = 1 表示删除。

表B插入三条数据,删除其中两条数据。

自己查询的时候,想要查询两张表中没有删除的数据,于是写了第一个查询语句,结果如下,

自己一看这结果明显的不对,表A是主表,会取表中的所有数据,这种查询方式只取到一条数据。
然后换一种方式进行查询,如下

得到了自己想要的结果,A表的所有记录都需要,去关联B表查询的时候,如果匹配到就取B表
的结果,如果没匹配到就返回null。进一步改进的查询方式为,

为了更好的比较,自己又添加一个查询语句,把b表的是否删除的条件去掉,查询结果如下

自己很好奇为什么会出现这种状况呢?查询条件写的位置不一样,就会导致查询结果不一致。
然后去网上寻找问题的答案,最终找到这个问题的答案:
on条件是在生成临时表的查询条件,不管连接的条件如何,最终都会返回主表的所有数据。
Where条件则是过滤掉临时表的数据,即是对最终数据的过滤,如果条件不符合则就直接过滤掉。
因此
SELECT
a.*, b. NAME
FROM
table_a a
LEFT JOIN table_b b ON a.id = b.id
WHERE
a.is_deleted = 0
AND b.is_deleted = 0;
这种查询方式就把后面两条数据过滤掉,因为其不满足 b.is_deleted = 0 的条件。
自己在查询的时候,只是想使用B表的有效数据进行关联查询,过滤条件就不能直接写在
Where条件中,需要写在on后面或者是使用子查询过滤掉。
到此问题解决。以前写关联查询的时候,不需要考虑数据是否有效都是直接进行关联查询,
现在遇到问题,则需要特别小心,稍微不注意就会出现意想不到的错误,吸取这次的深刻教训。
参考菜鸟教程中的答案。
https://www.runoob.com/w3cnote/sql-different-on-and-where.html
left jon连接查询踩坑记的更多相关文章
- <<Python编程:从入门到实践>>踩坑记 Django
<<Python编程:从入门到实践>>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- Spark踩坑记——共享变量
[TOC] 前言 Spark踩坑记--初试 Spark踩坑记--数据库(Hbase+Mysql) Spark踩坑记--Spark Streaming+kafka应用及调优 在前面总结的几篇spark踩 ...
- 记一次 Spring 事务配置踩坑记
记一次 Spring 事务配置踩坑记 问题描述:(SpringBoot + MyBatisPlus) 业务逻辑伪代码如下.理论上,插入数据 t1 后,xxService.getXxx() 方法的查询条 ...
- [转]Spark 踩坑记:数据库(Hbase+Mysql)
https://cloud.tencent.com/developer/article/1004820 Spark 踩坑记:数据库(Hbase+Mysql) 前言 在使用Spark Streaming ...
- Spark踩坑记——数据库(Hbase+Mysql)转
转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...
- Spark踩坑记:Spark Streaming+kafka应用及调优
前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从k ...
- Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记
前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...
- 【踩坑记】从HybridApp到ReactNative
前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...
随机推荐
- ESP8266的AT指令模块程序
最新代码可点击下载:ESP8266 模块代码 和以下代码实现方式不一致,更加自由可控 本段代码只是测试了esp8266作为服务器端使用,没有测试作为客户端使用. 没有超长延时等待或死循环等待AT指令反 ...
- Linux输出转换命令 xargs
一.基本用法 xargs命令的作用,是将标准输入转为命令行参数. 原因:大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数 如下面 echo 不接受标准输出做参 ...
- 小知识:MySQL配置文件优先级
今天在RHEL7上,严格按之前的安装规范文档,部署MySQL环境时,发现通过服务的方式启动MySQL失败: 关键错误是: log-error set to '/var/log/mariadb/mari ...
- Windows 10 配置Java 环境变量
下载 JDK 下载地址:https://www.oracle.com/java/technologies/downloads/ 点击下载按钮: 开始安装JDK: 可以设置为你想安装的路径. 环境变量配 ...
- Google三驾马车之二:MapReduce
第一次接触mr还是在入门mit6.824的lab1,最近重新读了一遍原始论文,又有了一些新的想法,简单做一些记录. 作为Google分布式系统的重要组成,本篇文章核心在于map/reduce操作带来的 ...
- NC19910 [CQOI2007]矩形RECT
题目链接 题目 题目描述 给一个a*b矩形,由a*b个单位正方形组成.你需要沿着网格线把它分成分空的两部分,每部分所有格子连通,且至少有一个格子在原矩形的边界上."连通"是指任两个 ...
- colrm命令
colrm命令 colrm命令用于编辑源代码文件,脚本文件或常规文本文件中的文本,此命令从文件中删除选定的列,列定义为一行中的单个字符.索引总是从1开始,而不是0.如果同时指定了开始和结束,则它们之间 ...
- 用ELK分析每天4亿多条腾讯云MySQL审计日志(3)--下载日志
当初分析日志,麻烦的是腾讯云的SQL审计日志下载,有下列限制: 1,单次最多1000万条下载 2,单个实例最多生成5条日志文件,多的要先删除以前文件才能生成 腾讯云日志文件生成界面: 一 ...
- BUU PWN RIP1 RET2CODE WRITEUP
1.下载附件后,运行是一个输入程序,IDA分析main函数,gets可溢出. F5伪代码如下: int __cdecl main(int argc, const char **argv, const ...
- 【Android逆向】Frida 无脑暴力破解看雪test2.apk
1. 安装apk到手机 adb install -t test2.apk apk下载位置: https://www.kanxue.com/work-task_read-800625.htm 2. 题目 ...