NULL 值处理
NULL 不是空字符串、不是 0、不是 false——它代表"未知"或"不存在"。在 SQL 里,任何值与 NULL 做比较运算(=、>、<)结果都是 UNKNOWN,而不是 TRUE 或 FALSE。这意味着 WHERE basic_salary = NULL 永远查不到东西——你得用 IS NULL 或 IS NOT NULL。
同样,NULL 参与算术运算结果也是 NULL:100 + NULL = NULL。聚合函数(COUNT、SUM、AVG)会自动忽略 NULL 值。COUNT(*) 统计所有行,COUNT(列名) 只统计该列非 NULL 的行——这个差异在报表里可能造成数字对不上。
飞翔科技的员工表里,performance_bonus 可能为 NULL(表示"该员工不适用绩效制度")。区分"值为 0"和"值为 NULL"在业务含义上完全不同——前者是"奖金为零",后者是"没有这条记录"。
标准写法:
-- 判断 NULL
WHERE 列名 IS NULL;
WHERE 列名 IS NOT NULL;
-- 处理 NULL 的函数
SELECT COALESCE(列名, 默认值) FROM 表名;
SELECT IFNULL(列名, 默认值) FROM 表名;
以飞翔科技为例:
-- 找出没有绩效奖金的员工
SELECT emp_name, basic_salary, performance_bonus
FROM employees
WHERE performance_bonus IS NULL;
-- 计算实发工资(奖金为 NULL 时按 0 算)
SELECT
emp_name,
basic_salary,
IFNULL(performance_bonus, 0) AS bonus,
basic_salary + IFNULL(performance_bonus, 0)
- IFNULL(social_security, 0) - IFNULL(personal_tax, 0) AS actual_salary
FROM employees
WHERE dept_code = 2;
IFNULL(performance_bonus, 0) 的意思是:如果奖金是 NULL,就当 0 来算。不用这个函数的话,basic_salary + NULL 结果就是 NULL——整行的实发工资算不出来。COALESCE 是标准 SQL 的写法,可以接受多个参数,返回第一个非 NULL 的值。