MySQL范围查询 IN 使用注意事项

1 摘要

当我们在做数据库查询优化时,可能会用到范围查询如 BETWEEN, IN 等语句,这里记录一次在项目中使用 IN 查询 IN 后边包含 NULL 值时导致查询结果错误的问题

2 场景复现

有一个用户表,里边总共有 11 条数据

-- IN 测试
SELECT COUNT(*) FROM `user`;

查询结果

mysql in 查询-1
使用 IN 进行范围查询,IN 后边包含 NULL

SELECT id FROM `user` WHERE id IN (1,2,3,NULL);

预想结果 :1,2,3
实际结果:
mysql in 查询-2
使用 NOT IN 进行反向查询

SELECT id FROM `user` WHERE id NOT IN (1,2,3,NULL);

预想结果: 4,5,6,7,8,9,10,11
实际结果:

mysql in 查询-2

3 结论

在 MySQL 数据中,当使用 NOT IN进行条件范围查询时, IN 后边如果有 NULL值,则可能导致查询结果错误

出现场景: 在多表联合查询时,可能 IN 后边接的是一个子查询,这时子查询结果就可能出现 NULL 值,就会导致上边的错误

4 解决办法

为了避免查询结果不准确,在使用 IN / NOT IN 进行范围查询时,IN 后边的值必须不为空,可以使用 IFNULL(expr1,expr2) 来对 NULL 值进行设定默认值

IFNULL(expr1,expr2) 方法使用说明: 如果表达式1(expr1) 为 NULL, 则整个表达式结果为表达式2(expr2)

eg:

-- 查询不在优惠范围内的商品数量
SELECT 
    COUNT(*) 
FROM `goods` g 
WHERE g.id NOT IN 
        ( SELECT IFNULL(cg.goods_id,0) 
          FROM `coupon` coup 
          LEFT JOIN `coupon_goods` cg ON cg.coupon_id = coup.id 
          WHERE coup.user_type IN (1,2) 
          GROUP BY cg.goods_id  
        ) 

个人公众号:404Code,记录半个互联网人的技术与思考,感兴趣的可以关注.
404Code

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值