1. 主页 > 好文章

SQL数据库空值查询指南:S NULL与IS NOT NULL的进阶用法


为什么你的查询结果总是不对?可能是你忽略了数据库里的"幽灵数据"——NULL值!很多新手在学SQL时,明明照着教程写语句,查出来的数据却莫名其妙少了几十条记录,这种情况十有八九是栽在空值处理上了。今天咱们就来掰扯清楚,怎么用??IS NULL??和??IS NOT NULL??这两个看似简单实则暗藏玄机的操作符。


一、NULL值到底是什么鬼?

别把NULL当空气!它既不是0也不是空字符串,而是??数据库里的特殊标记??。举个栗子:用户注册时没填手机号,这个字段在数据库里就会显示为NULL。这时候如果用=号查空值,就像用渔网捞空气——啥都捞不着。

查询方式结果说明
WHERE phone = ''查不到NULL记录空字符串≠NULL
WHERE phone IS NULL能查到真实空值正确打开方式

二、基础查询的三大坑位

  1. ??统计总数总出错??:
    COUNT(*)COUNT(字段名)的区别能坑哭新手。前者统计所有行数,后者??自动跳过NULL值??。想查实际有效数据量?记得用COUNT(字段名)

  2. ??算术运算变哑弹??:
    任何数字+NULL=NULL!比如计算平均分时,如果张三的数学成绩是NULL,整个计算结果都会泡汤。这时候得用??COALESCE函数??来救场:

    sql复制
    SELECT AVG(COALESCE(math_score,0)) 
    FROM students;
  3. ??条件筛选漏大鱼??:
    WHERE age > 18查成年人?那些没填年龄的用户就会人间蒸发。稳妥的做法是:

    sql复制
    WHERE (age > 18) OR (age IS NULL)

三、进阶玩家的五把刷子

  1. ??空值排序玄机??:
    默认排序时NULL总在最后,想让空值排前面?加个??CASE WHEN??魔法:

    sql复制
    ORDER BY CASE WHEN phone IS NULL THEN 0 ELSE 1 END
  2. ??联合查询防翻车??:
    用JOIN连接表时,空值字段就像绝缘体。这时候上??NVL函数??当桥梁:

    sql复制
    SELECT * 
    FROM tableA 
    LEFT JOIN tableB 
    ON NVL(tableA.id,0) = NVL(tableB.ref_id,0)
  3. ??条件聚合玩花样??:
    统计不同状态的数量时,记得给NULL留位置:

    sql复制
    SELECT 
      COUNT(CASE WHEN status IS NULL THEN 1 END) as null_count,
      SUM(CASE WHEN amount > 100 THEN 1 ELSE 0 END) as big_deals
    FROM orders
  4. ??更新数据避雷区??:
    想把空值改成默认值?别用=号赋值,正确的姿势是:

    sql复制
    UPDATE users 
    SET address = COALESCE(address,'未填写')
    WHERE address IS NULL;
  5. ??索引优化冷知识??:
    给包含NULL的字段建索引,就像在沙滩上盖房子——不牢靠。建议先用??NVL函数??转换再建索引:

    sql复制
    CREATE INDEX idx_phone 
    ON users(NVL(phone,'00000000000'));

四、灵魂拷问环节

??Q:为什么有时候IS NULL查不到数据???
A:八成是字段设置了NOT NULL约束,或者用了默认值填充。这时候得用??DESC表结构??看看字段属性。

??Q:空值会影响查询性能吗???
A:大量NULL值会让索引失效,就像高速公路突然变乡间小路。建议定期用??NULL值占比统计??监控数据质量:

sql复制
SELECT 
  COUNT(*) total,
  COUNT(*) - COUNT(字段名) as null_count
FROM 表名;

个人观点:处理空值就像给数据库做体检,不能光看表面数据。特别是做数据分析的新手,千万别被表面完整的报表欺骗——那些隐藏的NULL值才是真正的数据杀手。记住,好的SQL工程师不是不会犯错,而是懂得在关键位置埋下??COALESCE??这样的安全气囊。

本文由嘻道妙招独家原创,未经允许,严禁转载