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)
上一篇 2022年5月6日 上午9:05
下一篇 2022年5月6日 上午9:05


相关推荐

  • 奇异矩阵及广义逆矩阵

    奇异矩阵及广义逆矩阵再介绍奇异矩阵以及矩阵的广义逆之前 先复习几个概念 然后我一步步给出奇异矩阵和广义逆的介绍 伴随矩阵 1 余子式定义 1 余子式 在 nnn 阶行列式 A A A 中 划去元素 aijaija ij 所在的行和列 剩下的元素 显然 剩下了 n 1 2 n 1 2 n 1 2 个元素 按照原先的排列生成的新行列式的值称为元素 aijaija ij 的余子式 记为 MijMijM

    2026年3月19日
    3
  • 【已解决】戴尔笔记本电脑的卡顿问题.

    【已解决】戴尔笔记本电脑的卡顿问题.卡顿检测(主要用于戴尔笔记本):卡顿超过300ms的时候会记录卡顿发生的时间点和卡顿持续的时间.用的是一个Timer(定时器)来检测触发间隔,原理非常简单.此程序使用VB.NET编写,绝无病毒,你可以使用ilspy反编译来查看源代码.在每次开机的时候打开此软件,在每次关机前查看此软件的显示内容,判断是否有卡顿.你可以根据卡顿的状况来判断卡顿是哪些软件造成的.若卡顿出现的不频…

    2025年10月29日
    10
  • Ubuntu安装OpenClaw报错Gateway service check failed解决方法

    Ubuntu安装OpenClaw报错Gateway service check failed解决方法

    2026年3月16日
    3
  • DNS 全局负载均衡(GSLB)基本原理[通俗易懂]

    DNS 全局负载均衡(GSLB)基本原理[通俗易懂]采用全局负载均衡(GSLB)的前提是在不同地区设立多个数据中心,业务已经做了分布式部署的规划,无论用户从哪个IDC访问都能得到相同的结果,或者用户基本不会出现跨区域流动访问的情况,只会访问就近IDC。解析步骤1.用户向本地DNS服务器发出查询请求,如果本地DNS服务器有该域名的缓存记录,如果本地DNS服务器有该域名的缓存记录,则返回给用户,否则进行第2步2.本地DNS服务器进行递归查询,最终会查询到域名注册商处的授权DNS服务器3.授权DNS服务器其返回一条NS记录给本地DNS服务器。.

    2022年5月16日
    54
  • 台式计算机网线插哪里,电脑主机网线插哪里?

    台式计算机网线插哪里,电脑主机网线插哪里?问:电脑主机网线插在哪里?答:这个需要根据你家的上网情况来决定,主要是看有没有用到路由器上网,下面进行详细说明。1、如果你家里没有用路由器,那么电脑主机上的网线,需要插在猫的网口/LAN口。温馨提示:没有用路由器的情况下,电脑要上网的话,你需要打开电脑中的“宽带连接”程序,然后填写你家的宽带账号、宽带密码,就能连接上网了。如果你不知道如何用“宽带连接”程序拨号上网,可以点击阅读下面的文章,查看详…

    2022年6月26日
    36
  • 如何理解矩阵特征值?

    如何理解矩阵特征值?李浩 nbsp FPA 蓝色 EE 知乎用户 TavionFu 雄哼哼 nbsp 等人赞同补充 答主现在用到的多数是对称矩阵或酉矩阵的情况 有思维定势了 写了半天才发现主要讲的是对称矩阵 这答案就当科普用了 特征值在很多领域应该都有自己的用途 它的物理意义到了本科高年级或者研究生阶段涉及到具体问题的时候就容易理解了 刚学线性代数的话 确实抽象

    2026年3月17日
    2

发表回复

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

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