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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。

    浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。微信搜索程序员的起飞之路可以加我公众号,保证一有干货就更新~本人的几点浅见,各位大大不喜勿喷。先说下这俩到底是干啥的吧。其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。说是CreateStatement和PrepareStatement的区别,但其实说的就是Statement和PrepareStatement的区别,相信大家在网上已经看到过不少这方面的资料和博客,我在此处提几点,大家看到过的,就当重记忆,没看到就当补充~下面开始谈谈他.

  • PyTorch—torchvision.models导入预训练模型—残差网络代码讲解

    PyTorch—torchvision.models导入预训练模型—残差网络代码讲解PyTorch框架中torchvision模块下有:torchvision.datasets、torchvision.models、torchvision.transforms这3个子包。关于详情请参考官网:http://pytorch.org/docs/master/torchvision/index.html。具体代码可以参考github:https://github.com/pytorc…

  • dns服务器地址为空,dns服务器地址为空

    dns服务器地址为空,dns服务器地址为空dns服务器地址为空内容精选换一换在执行基本配置操作前,以root用户登录云服务器。在配置内网DNS后,弹性云服务器可以通过虚拟私有云的内网访问相关云服务,能够为用户提供更稳定、可靠的网络环境。配置DNS需要配置“/etc”目录下的resolv.conf文件,指定DNS服务器的IP地址。内网DNS服务器的IP地址与用户所处的区域相关,用户可通过表1获取内网DNS服务器的I内网下载镜像失败基本上都…

  • 【转载】SOAP协议介绍

    【转载】SOAP协议介绍

    2021年11月18日
  • 购物车功能模块设计图_超市购物车设计

    购物车功能模块设计图_超市购物车设计一、 需求分析 一:购物车模块功能需求 客户在浏览网页的时候,当遇到喜欢的商品、又不急于结账而是继续浏览货物时。需要一个购物篮来存储她已经选中的商品。以便于结账或用于对比商品的详细参数。用户在购物车页面中需要对购物车中的商品添加数量、移除商品、清空购物车等功能。

  • Android 编译_android线程

    Android 编译_android线程之前本地环境编译一直是正常的,后来更新代码后,出现编译不过。提示outofmemory,但是查看swap和内存都还是够的。里面有个提示,tryincreasingheapsizewithjavaoption’-Xmx’,就按照这个来改。失败截图:解决方案:exportJACK_SERVER_VM_ARGUMENTS=”-Dfile.e

发表回复

您的电子邮箱地址不会被公开。

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