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

文章目录

      • 1 摘要
      • 2 场景复现
      • 3 结论
      • 4 解决办法

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

你可能感兴趣的:(MySQL范围查询 IN 使用注意事项)