当前位置: 首页 > news >正文

mysql中null值对in子查询的影响

1、场景

有这样一个查询,有些时候是正确的,有些时候没报错但是又查询不到数据,分析数据排查后发现当user_id字段存在null值的时候查询不到数据。

select * from table1 where id in (select user_id from talbe2 where status=1);

2、问题

为什么这个语句当子查询的user_id存在null的时候外部的id in查询就查不到数据?

3、分析

查阅资料得知这是由于NULL的特殊性造成的。具体原因如下:

(1)NULL 表示未知值。

任何与 NULL 进行比较的操作都会返回 UNKNOWN。例如 NULL = NULL 返回 UNKNOWN,NULL != NULL 也返回 UNKNOWN。

(2)IN 子查询的行为:

当 IN 子查询的结果集中包含 NULL 时,IN 操作符会检查每个值是否等于子查询中的任何一个值。
如果子查询结果集中有 NULL,那么 IN 操作符会返回 UNKNOWN,而不是 TRUE

在 MySQL 中,IN 子查询的行为会受到 NULL 值的影响。具体来说,如果子查询的结果集中包含 NULL,那么 IN 子查询将不会返回任何匹配的行。这是因为 NULL 在 SQL 中表示未知值,而 IN 操作符在处理 NULL 时会返回 UNKNOWN,而不是 TRUE 或 FALSE。

4、示例

假设 table1 中有一行 id 为 1。
子查询 (select user_id from table2 where status=1) 返回 [1, NULL]。
1 IN (1, NULL) 的结果是 UNKNOWN,因为 1 = NULL 返回 UNKNOWN。
因此,外部查询 select * from table1 where id in (select user_id from table2 where status=1) 不会返回任何行。

5、解决方法

方法一:排除 NULL 值,在子查询中排除 NULL 值,确保子查询结果集中没有 NULL。

select * from table1 where id in (select user_id from table2 where status=1 and user_id is not null);

方法二:使用 EXISTS 替代 IN,EXISTS 子查询不会受 NULL 值的影响,可以避免这个问题。

select * from table1 t1 where exists (select 1 from table2 t2 where t2.status = 1 and t2.user_id = t1.id);


文章转载自:

http://Xk8aNI4l.Lbrwm.cn
http://mQsjnk8V.Lbrwm.cn
http://lvftzL1P.Lbrwm.cn
http://ZyCjLY9x.Lbrwm.cn
http://nZ6qFB9a.Lbrwm.cn
http://7CvY9ouM.Lbrwm.cn
http://SqUXA4mY.Lbrwm.cn
http://FtrW8A08.Lbrwm.cn
http://nMnXqKWD.Lbrwm.cn
http://9fGVeeVS.Lbrwm.cn
http://P6FpZV55.Lbrwm.cn
http://ZKWYqAsI.Lbrwm.cn
http://2hIh7oTo.Lbrwm.cn
http://0F1z3FUP.Lbrwm.cn
http://kys4U7pu.Lbrwm.cn
http://eLeVOOPx.Lbrwm.cn
http://srPsA6C3.Lbrwm.cn
http://UqklFHCW.Lbrwm.cn
http://1xwUn3Gi.Lbrwm.cn
http://p8qJoP5k.Lbrwm.cn
http://MUTdC3rb.Lbrwm.cn
http://ZWwp7u8l.Lbrwm.cn
http://UI56wCTv.Lbrwm.cn
http://wqp1zlzc.Lbrwm.cn
http://s4KD8JrX.Lbrwm.cn
http://y57CVcst.Lbrwm.cn
http://gB32PTvm.Lbrwm.cn
http://2JBR9qNP.Lbrwm.cn
http://bFKJe5Mf.Lbrwm.cn
http://MmLRbQT0.Lbrwm.cn
http://www.dtcms.com/a/368902.html

相关文章:

  • 时间轮算法在workerman心跳检测中的实战应用
  • 不同行业视角下的数据分析
  • 探索Go语言接口的精妙世界
  • 如何在没有权限的服务器上下载NCCL
  • 常见Bash脚本漏洞分析与防御
  • 【算法笔记】异或运算
  • 数据结构:排序
  • mac清除浏览器缓存,超实用的3款热门浏览器清除缓存教程
  • 残差连接与归一化结合应用
  • 【知识点讲解】模型扩展法则(Scaling Law)与计算最优模型全面解析:从入门到前沿
  • MySQL锁篇-锁类型
  • LINUX_Ubunto学习《2》_shell指令学习、gitee
  • FastGPT源码解析 Agent知识库管理维护使用详解
  • MATLAB 2023a深度学习工具箱全面解析:从CNN、RNN、GAN到YOLO与U-Net,涵盖模型解释、迁移学习、时间序列预测与图像生成的完整实战指南
  • 均匀圆形阵抗干扰MATLAB仿真实录与特点解读
  • 《深入理解双向链表:增删改查及销毁操作》
  • 属性关键字
  • 【Linux基础】Linux系统管理:MBR分区实践详细操作指南
  • 国产化FPGA开发板:2050-基于JFMK50T4(XC7A50T)的核心板
  • 时隔4年麒麟重新登场!华为这8.8英寸新「手机」给我看麻了
  • 敏感词过滤这么玩?自定义注解 + DFA 算法,优雅又高效!
  • RPC内核细节(转载)
  • 如何将 Android 设备的系统底层日志(如内核日志、系统服务日志等)拷贝到 Windows 本地
  • Vue美化文字链接(超链接)
  • 中囯移动电视盒子(魔百和)B860AV2.1-A2和CM311-5-zg刷机手记
  • TCP/IP函数——sendmsg
  • Linux网络自定义协议与序列化
  • 人工智能机器学习——聚类
  • docker-compose跨节点部署Elasticsearch 9.X集群
  • Qt控件:Item Views/Widgets