详细介绍:SQL-流程控制函数
一、IF函数:条件判断函数
IF函数用于根据条件的真假返回不同的值,类似程序中的 “三目运算符”。
语法格式:
IF(condition, value_if_true, value_if_false)
condition:判断条件(返回TRUE或FALSE的表达式);value_if_true:条件为TRUE时返回的值;value_if_false:条件为FALSE时返回的值。
示例解析:
-- 条件为TRUE(真),返回第二个参数'ok'
select if(true, 'ok', 'Error'); -- 结果:'ok'
-- 条件为FALSE(假),返回第三个参数'Error'
select if(false, 'ok', 'Error'); -- 结果:'Error'
实际应用场景:根据字段值动态返回描述,例如:
-- 若年龄>=18,返回'成年',否则返回'未成年'
select name, if(age >= 18, '成年', '未成年') as age_desc from emp;
注意事项:
condition可以是任意返回布尔值的表达式(如age > 30、gender = '男'等);- 若
condition为NULL,函数返回value_if_false(视为FALSE); - 函数返回值的类型由
value_if_true和value_if_false决定,若类型不同可能发生隐式转换(如数值和字符串混合时,可能转为字符串)。
二、IFNULL函数:空值处理函数
IFNULL函数用于判断第一个参数是否为NULL,若不为NULL则返回该值,否则返回第二个参数(默认值)。
语法格式:
IFNULL(expr1, expr2)
expr1:待判断的表达式;expr2:当expr1为NULL时返回的值。
示例解析:
-- 第一个参数'ok'不为NULL,返回'ok'
select ifnull('ok', 'default'); -- 结果:'ok'
-- 第一个参数是空字符串(''),不为NULL,返回空字符串(''≠NULL)
select ifnull('', 'default'); -- 结果:''
-- 第一个参数是NULL,返回第二个参数'default'
select ifnull(null, 'default'); -- 结果:'default'
实际应用场景:处理可能为NULL的字段,避免结果中出现NULL,例如:
-- 若idcard为NULL,返回'未填写',否则返回实际身份证号
select name, ifnull(idcard, '未填写') as idcard_desc from emp;
注意事项:
- 仅判断
NULL:IFNULL只对NULL生效,对空字符串('')、0等非NULL值不处理(如上述示例中的ifnull('', 'default')返回''); - 兼容性:
IFNULL是 MySQL 特有函数,其他数据库有类似函数但名称不同(如 SQL Server 用ISNULL,Oracle 用NVL); - 若两个参数都为
NULL,返回NULL(如ifnull(null, null)→NULL)。
三、CASE函数:多条件分支判断
CASE函数用于实现多条件分支判断,类似程序中的 “if-else if-else” 或 “switch-case”,分为 ** 简单CASE和搜索CASE** 两种形式。
1. 简单CASE表达式(等值判断)
语法格式:
CASE 表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
...
ELSE 默认结果
END
- 先计算 “表达式” 的值,再依次与
WHEN后的 “值” 比较,匹配则返回对应 “结果”; - 若均不匹配,返回
ELSE后的 “默认结果”(若省略ELSE,返回NULL)。
示例解析:
-- 对emp表的workaddress进行分类:北京、上海→一线城市,其他→二线城市
select emp.name,
-- 简单CASE:判断workaddress的值,匹配则返回对应结果
(case emp.workaddress
when '北京' then '一线城市' -- 若workaddress='北京',返回'一线城市'
when '上海' then '一线城市' -- 若workaddress='上海',返回'一线城市'
else '二线城市' -- 其他情况返回'二线城市'
end) as '工作地址' -- 结果列别名为'工作地址'
from emp;
假设emp表中某员工的workaddress为 ' 南京 ',则该员工的 “工作地址” 列返回 ' 二线城市 '。
2. 搜索CASE表达式(条件判断)
语法格式:
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE 默认结果
END
- 依次判断
WHEN后的 “条件”,第一个满足条件的分支返回对应 “结果”; - 若均不满足,返回
ELSE后的 “默认结果”(若省略ELSE,返回NULL)。
示例解析:
首先创建score表并插入数据:
-- 创建学员成绩表,包含ID、姓名及数学、英语、语文成绩
create table score(
id int comment 'ID',
name varchar(10) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
)comment '学员成绩表';
-- 插入3条学员成绩数据
insert into score (id, name, math, english, chinese) values
(1, 'Tom', 67, 88, 95), -- Tom:数学67,英语88,语文95
(2, 'Rose', 23, 66, 90), -- Rose:数学23,英语66,语文90
(3, 'Jack', 56, 98, 76); -- Jack:数学56,英语98,语文76
查询并对各科成绩分级(优秀:≥85;及格:≥60 且 < 85;不及格:<60):
-- 查看score表所有数据(用于对比分级结果)
select * from score;
-- 对数学、英语、语文成绩分别分级
select
id,
name,
-- 数学成绩分级:搜索CASE,按条件顺序判断
case when math >= 85 then '优秀' -- 条件1:数学≥85→优秀
when math >=60 then '及格' -- 条件2:数学≥60(且= 85 then '优秀'
when english >=60 then '及格'
else '不及格' end as english_level,
-- 语文成绩分级(逻辑同上)
case when chinese >= 85 then '优秀'
when chinese >=60 then '及格'
else '不及格' end as chinese_level
from score;
查询结果解析:
- Tom 的数学 67 分:满足
math >=60但不满足>=85→及格; - Tom 的英语 88 分:满足
english >=85→优秀; - Rose 的数学 23 分:不满足前两个条件→
不及格。
CASE函数注意事项:
分支顺序敏感:
CASE函数按WHEN的顺序判断,找到第一个满足条件的分支后立即返回,后续分支不再执行。例如:-- 错误示例:条件顺序颠倒,会导致所有≥60的分数都返回'及格'(包括≥85的) case when math >=60 then '及格' when math >=85 then '优秀' -- 永远不会执行 else '不及格' end需按 “范围从大到小” 或 “优先级从高到低” 排列条件。
ELSE的必要性:若省略ELSE且所有条件都不满足,返回NULL。建议显式添加ELSE明确默认值,避免意外NULL。返回值类型统一:
THEN后的值类型应尽量一致(如均为字符串或均为数值),否则可能发生隐式转换,影响结果可读性。适用场景广泛:可用于字段值转换(如将编码转为名称)、分级统计(如成绩等级)、条件聚合(如按不同条件计算总和)等。
总结
IF(condition, v1, v2):简单二分支判断,适合非此即彼的场景;IFNULL(expr, default):处理NULL值,返回默认值(仅对NULL生效);CASE:多分支判断,支持等值匹配(简单CASE)和条件判断(搜索CASE),适合复杂逻辑。

浙公网安备 33010602011771号