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 ...
随机推荐
- 搭建mongo的replica set
搭建mongo的replica set 前言 安装 构建副本集 加入认证 备份数据 备份数据到本地 数据恢复 搭建mongo的replica set 前言 准备三台机器,相互可以访问的.处理思路,先构 ...
- 14.2 Socket 反向远程命令行
在本节,我们将继续深入探讨套接字通信技术,并介绍一种常见的用法,实现反向远程命令执行功能.对于安全从业者而言,经常需要在远程主机上执行命令并获取执行结果.本节将介绍如何利用 _popen() 函数来启 ...
- pywin32 实现寻找窗体并模拟按键
import win32api import win32gui, win32con import win32clipboard import re import time class cWindow: ...
- jetbrains 系列 terminal history 设置
之前的版本中 jetbrains 的 terminal 使用的是 ~/.zsh_history, 改版后使用的不是一个 history, 就会出现在 iterm2 中使用的 command, 在 py ...
- 《字节码编程》PDF107页,11万字。既然市面缺少ASM、Javassist、Byte-buddy成体系的学习资料,那我来!
作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 让人怪不好意思的,说是出书有点膨胀,毕竟这不是走出版社的流程,选题. ...
- 使用window.print进行前端打印,批量打印,设置分页,ie、火狐下设置页眉页脚
window.print() print() 方法用于打印当前窗口的内容.谷歌调用 print() 方法会产生一个打印预览弹框,让用户可以设置打印请求. 但谷歌貌似不能自定义设置页眉页脚的文字:ie和 ...
- 关于laravel路由无法访问(nginx)
laravel路由无法访问 被这个问题折腾了 好几次了,记录一下希望可以帮到后面的朋友 在laravel路由中配置好了之后无法访问的问题有可能是因为在本地服务配置的问题(我使用的是nginx服务器) ...
- ElasticSearch7.3学习(四)----结合Spring boot进行增删改查和批量(bulk)详解
1.前置 java api 文档 https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.3/java-rest-overvi ...
- HBase执行stop-hbash.sh关闭命令等待时间过长
问题描述 执行stop-hbase.sh时,等待很长时间都没结束(出来很多"...") 解决办法: hbase-daemons.sh stop masterhbase-daemon ...
- Hive-服务启动和停止命令
1.启动命令 #!/bin/bash nohup hive --service metastore >> $HIVE_HOME/logs/metasotre.log 2>&1 ...