mysql左连接丢失null值的问题

mysql左连接丢失null值的问题一、前言      如题所示,我们有的时候直接使用左连接查询,当右表不存在该数据的时候,是可以查出带有null的列。可是当在where条件中有右表相关的筛选条件时,我们惊奇的发现查询的结果不带null值了,换句话说就是查出来的结果比预期的少。      博主之前遇到过这个问题…

大家好,又见面了,我是你们的朋友全栈君。

一、前言

      如题所示,我们有的时候直接使用左连接查询,当右表不存在该数据的时候,是可以查出带有null的列。可是当在where条件中有右表相关的筛选条件时,我们惊奇的发现查询的结果不带null值了,换句话说就是查出来的结果比预期的少。

      博主之前遇到过这个问题,只不过当时解决了就没记录。谁知道前两天有朋友问到这个sqlnnd给忘记了,又耗费了大半个小时,这里还是记录下。

二、错误复现以及解决方案

1、右表不带筛选条件的查询

sql相关的表主要是w_order(订单表)和w_a_info(商品种类表):

SELECT
  o.id ,
 a.name,
 o.order_time
FROM
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid
WHERE
  a.ifshow = 200
GROUP BY
 a.id

结果:

id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
NULL	黄焖鸡1			NULL

这里能看到,我们查询出来的有带有NULL值的列。

2、右表带有筛选条件

SELECT
  o.id ,
 a.name,o.order_time
FROM
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid
WHERE
  a.ifshow = 200
  and o.order_time>0
GROUP BY
 a.id
 

结果:


id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342

      根据结果发现,我们原来带有null值的列消失了,是的,是被where中的筛选条件给筛选掉了。只是有时候我们的需求是要获取所有的商品信息的,因此这个null列还不能被筛选掉,不然就造成数据缺失了。

      这里推测是因为sql的执行顺序,on表连接是先于where条件的,因此我们先on连接之后,产生了不符合条件的NULL列,然后NULL列被where条件给筛选掉了。这里解决方案是把右表的筛选条件放到前面去,也就是连表的地方去。

3、左连接之后加筛选条件

SELECT

  o.id ,
 a.name,
 o.order_time
FROM
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid AND o.order_time>0
WHERE
  a.ifshow = 200
GROUP BY
 a.id

结果:

id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
NULL	黄焖鸡1			NULL

      这里我们把筛选条件放到连接处,通过on ... and ... 的方式,在连接时就附带上条件,此时不符合条件的数据列还是以null值的方式展现,并不会被后续的where筛选条件给筛选掉。

end

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137920.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入浅出谈开窗函数(一)

    深入浅出谈开窗函数(一)

    2021年12月5日
    45
  • 前端和后端(Java)开发哪个难?,哪个学习容易一点?

    前端和后端(Java)开发哪个难?,哪个学习容易一点?前端和后端(Java)开发哪个难?,哪个学习容易一点?关于前端和后端java学习难以程度,以下是我的分享。难易程度:web前端开发起点低。容易入门,相对于Java来说,前端对于逻辑思维的要求比较低,所以学习前端也要容易一些,所以你不用担心学不会。很多程序员都是0基础开始学的,而且因为职位所处位置的交叉性,也就有很多Web前端开发人员是转行而来。HTML5前端源于HTML语言发展而来,由于HTML和CSS起点低、容易入门。java语言语法简单,但有一定难度Java语言拥有与C、C++等众多流行语

    2022年7月7日
    24
  • python点云处理算法汇总(长期更新版)

    python点云处理算法汇总(长期更新版)python点云处理算法整理

    2022年5月28日
    38
  • 亚信安全发布2021年挖矿病毒专题报告,聚焦挖矿病毒进化与治理

    亚信安全发布2021年挖矿病毒专题报告,聚焦挖矿病毒进化与治理供稿|亚信安全出品|CSDN云计算近日,《亚信安全2021年挖矿病毒专题报告》正式发布(以下简称《报告》)。《报告》以2021年亚信安全威胁情报与服务运营部门所监测、分析和处置的挖矿病毒事件为基础,对各类挖矿病毒和攻击进行分析梳理与情况总结,并且深度探究未来可能会演化的方向,以此帮助更多用户,以更安全、更高效、更全面的行动做出安全规划,为挖矿病毒治理提供了参考路径。2021年挖矿病毒大事件全面回顾2021全年,亚信安全共拦截挖矿病毒516,443次。《报告》基于此整体梳.

    2022年5月20日
    55
  • 浅谈RHEL7和RHEL6的主要变化

    浅谈RHEL7和RHEL6的主要变化

    2022年4月2日
    49
  • scrapy环境配置_python的安装环境

    scrapy环境配置_python的安装环境本文仅供学习交流使用,如侵立删!联系方式及demo下载见文末PythonScrapy安装及相关配置环境win10Python:3.6.7Scrapy:2.4.1Python安装Scrapy安装pipinstallscrapy解决Command“pythonsetup.pyegg_info”failedwitherrorcode1问题更新pippipinstall–upgradepip问题:权限不足解决:pip

    2022年9月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号