MySQL if函数
1. 语法
sql
IF(condition, value_if_true, value_if_false)
2. 参数解释
condition
: 这是一个布尔表达式,会被评估为TRUE
、FALSE
或NULL
。value_if_true
: 当condition
评估为TRUE
(非零、非NULL) 时,函数返回的值。value_if_false
: 当condition
评估为FALSE
(0) 或NULL
时,函数返回的值。
3. 工作原理
IF
函数的工作流程非常简单:
评估
condition
。如果结果为
TRUE
,则返回value_if_true
。如果结果为
FALSE
或NULL
,则返回value_if_false
。
4. 示例
假设我们有一个名为 users
的表:
id | name | age | score |
---|---|---|---|
1 | Alice | 25 | 85 |
2 | Bob | 17 | 92 |
3 | Charlie | 30 | 78 |
4 | David | 16 | NULL |
示例 1:基础条件判断
将年龄大于等于 18 岁的标记为 “Adult”,否则标记为 “Minor”。
sql
SELECTname,age,IF(age >= 18, 'Adult', 'Minor') AS age_group FROM users;
结果:
name | age | age_group |
---|---|---|
Alice | 25 | Adult |
Bob | 17 | Minor |
Charlie | 30 | Adult |
David | 16 | Minor |
示例 2:处理 NULL 值
检查 score
字段是否为 NULL,如果是,则显示 “No Score”,否则显示原分数。
sql
SELECTname,score,IF(score IS NULL, 'No Score', score) AS result FROM users;
或者,更简洁地,利用 IF
对 NULL
的判断:
sql
SELECTname,score,IF(score IS NOT NULL, score, 'No Score') AS result FROM users;
结果:
name | score | result |
---|---|---|
Alice | 85 | 85 |
Bob | 92 | 92 |
Charlie | 78 | 78 |
David | NULL | No Score |
示例 3:在 UPDATE 语句中使用
给所有未成年人(age < 18)的分数额外加 10 分(照顾分)。
sql
UPDATE users SET score = IF(age < 18, score + 10, score); -- 或者使用 CASE WHEN,但 IF 更简洁
执行后,Bob 的分数会变成 102,David 的分数仍然是 NULL(因为 NULL + 10 还是 NULL)。
示例 4:在 ORDER BY 中使用
我们希望先显示有分数的用户,再显示没有分数的用户。
sql
SELECTname,score FROM users ORDER BY IF(score IS NULL, 1, 0), score DESC;
这里 IF(score IS NULL, 1, 0)
为有分数的用户返回 0,没分数的返回 1。ORDER BY
先按这个值升序排列(0在前,1在后),再按分数降序排列。
结果:
name | score |
---|---|
Bob | 92 |
Alice | 85 |
Charlie | 78 |
David | NULL |
5. 嵌套 IF 函数
对于更复杂的多重条件判断,你可以嵌套 IF
函数,但这可能会降低可读性。
例如,根据分数划分等级:
90 及以上:A
80 到 89:B
70 到 79:C
70 以下:D
无成绩:F
sql
SELECTname,score,IF(score IS NULL, 'F',IF(score >= 90, 'A',IF(score >= 80, 'B',IF(score >= 70, 'C', 'D')))) AS grade FROM users;
结果:
name | score | grade |
---|---|---|
Alice | 85 | B |
Bob | 92 | A |
Charlie | 78 | C |
David | NULL | F |
注意:对于这种多重分支的情况,使用
CASE WHEN
语句通常结构更清晰,更易于维护。
6. IF 函数 vs CASE 表达式
特性 | IF 函数 | CASE 表达式 |
---|---|---|
标准性 | MySQL 特有 | SQL 标准,几乎所有数据库都支持 |
适用场景 | 简单的“二选一”场景 | 简单的“二选一”或复杂的多重条件判断 |
可读性 | 简单场景下非常简洁 | 复杂场景下结构更清晰 |
灵活性 | 只能处理一个条件 | 可以处理多个 WHEN ... THEN ... 分支 |
简单选择建议:
如果只是简单的“如果是A,则B,否则C”,用
IF
。如果条件超过两个,或者逻辑比较复杂,用
CASE WHEN
。
总结
MySQL 的 IF
函数是一个极其实用的工具,它让你可以在 SQL 查询中直接嵌入逻辑判断,从而动态地改变返回结果。熟练掌握它和 CASE
表达式,能让你写出更强大、更灵活的 SQL 语句。