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

sql查询时对null的处理

1. ​​NULL的基本概念​

  • ​定义​​:NULL代表“无值”或“未知值”,与空字符串''或数字0不同。
  • ​三值逻辑​​:SQL的条件判断有三种结果:TRUEFALSEUNKNOWN。涉及NULL的运算通常返回UNKNOWN,在WHEREHAVING子句中,只有TRUE的条件会被选中。

2. ​​在WHERE子句中的处理​

  • ​错误方式​​:column = NULL永远返回UNKNOWN,不会匹配任何行。

  • ​正确方式​​:

    • IS NULL:筛选NULL值。
    • IS NOT NULL:筛选非NULL值。
    SELECT * FROM employees WHERE salary IS NULL; -- 查找未填写薪资的员工
    SELECT * FROM employees WHERE salary IS NOT NULL; -- 查找已填写薪资的员工

3. ​​聚合函数中的NULL处理​

  • ​COUNT​​:
    • COUNT(*):统计所有行数,包括NULL
    • COUNT(column):统计非NULL值的数量。
  • ​SUM/AVG/MAX/MIN​​:忽略NULL值。若所有值均为NULL,返回NULL
  • ​示例​​:
    SELECT AVG(COALESCE(salary, 0)) FROM employees; -- 将NULL替换为0后计算平均值

4. ​​JOIN操作中的NULL​

  • ​外连接​​:未匹配的列会填充NULL(如LEFT JOIN右表无匹配时)。
  • ​注意事项​​:在WHERE中对连接后的NULL过滤需谨慎,可能意外排除行。
     
    SELECT e.name, d.department_name
    FROM employees e
    LEFT JOIN departments d ON e.dept_id = d.dept_id
    WHERE d.dept_id IS NULL; -- 查找未分配部门的员工

5. ​​排序与分组中的NULL​

  • ​排序​​:

    • 默认排序:不同数据库行为不同(如MySQL将NULL排在开头,Oracle排在末尾)。
    • 显式控制:使用NULLS FIRSTNULLS LAST
    SELECT name, salary FROM employees ORDER BY salary NULLS LAST;
  • ​GROUP BY​​:所有NULL值会被分到同一组。


6. ​​使用函数处理NULL​

  • ​COALESCE​​:将NULL替换为默认值。

    SELECT COALESCE(salary, 0) AS adjusted_salary FROM employees;
  • ​NULLIF​​:将特定值转换为NULL

    SELECT NULLIF(salary, 0) AS non_zero_salary FROM employees; -- 将0转为NULL

7. ​​IN和NOT IN中的NULL​

  • ​IN子句​​:包含NULL时不影响结果(如1 IN (1, NULL)返回TRUE)。
  • ​NOT IN子句​​:若子查询或列表包含NULL,结果可能为UNKNOWN导致无返回。
    SELECT * FROM employees WHERE id NOT IN (SELECT manager_id FROM departments); -- 若manager_id有NULL,可能无结果
    -- 更安全的替代方案:使用NOT EXISTS

8. ​​其他注意事项​

  • ​算术运算​​:涉及NULL时结果为NULL(如5 + NULL返回NULL)。
  • ​唯一约束​​:多数数据库允许多个NULL值(因NULL不等于任何值,包括自身)。
  • ​CHECK约束​​:CHECK(column > 0)允许NULL(需显式处理 ​​索引​​:部分数据库(如Oracle)的B-tree索引不包含NULL,可能影响查询性能。

9. ​​不同数据库的差异​

-约束​**​:SQL标准允许多个NULL,但某些数据库(如SQL Server)可能限制。

  • ​NULL排序​​:行为可能不同,需显式指定。
  • ​函数兼容性​​:如MySQL的CONCAT('a', NULL)返回NULL,而CONCAT_WS会忽略NULL

10. ​​最佳实践​

  1. 显式处理NULL:使用IS NULLCOALESCE等确保逻辑正确。
  2. 设计表结构时:明确是否需要NOT NULL约束,避免意外NULL
  3. 测试边界情况:特别是聚合和连接操作中的NULL影响。

相关文章:

  • txt、Csv、Excel、JSON、SQL文件读取(Python)
  • Vuex Actions 多参数传递的解决方案及介绍
  • vivado + modelsim 仿真:Post-Synthesis Timing Simulation
  • scapy使用
  • 【产品体验】豆包大模型实时语音本地化部署及功能体验
  • 2025年第十六届蓝桥杯省赛C++ 研究生组真题
  • 第四节:React Hooks进阶篇-useEffect依赖项为空数组[]与不写的区别
  • 如何修改服务器TTL值
  • [特殊字符] 第十三讲 | 地统计模拟与空间不确定性评估
  • Devil May Cry 4 SE (鬼泣4)运行报错 【由于找不到INPUT1_3.dll,无法继续执行代码。重新安装程序肯会解决此问题。】
  • 『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解
  • java之多线程
  • [Dify] 使用 Docker 本地部署 Dify 并集成 Ollama 模型的详细指南
  • Android监测顶层包名+类名
  • 动态规划(6)——01背包问题
  • 2025蓝桥杯JavaB组
  • jupyter notebook 无法启动- markupsafe导致
  • Day3—循环起来吧
  • 深入理解 PyTorch 的 nn.Embedding:词向量映射及变量 weight 的更新机制
  • 算法专题:双指针
  • app聊天软件开发/aso优化注意什么
  • MAC怎么做网站/如何在各大平台推广
  • 个人网站内容有哪些内容/南京广告宣传公司seo
  • 济南行知网站制作/广东今日最新疫情通报
  • 政府网站手机版建设方案/seo排名优化推广
  • 完善网站建设报告/企业微信scrm