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 结果1WHEN 值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
表达式(条件判断)
语法格式:
CASEWHEN 条件1 THEN 结果1WHEN 条件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;-- 对数学、英语、语文成绩分别分级
selectid,name,-- 数学成绩分级:搜索CASE,按条件顺序判断case when math >= 85 then '优秀' -- 条件1:数学≥85→优秀when math >=60 then '及格' -- 条件2:数学≥60(且<85)→及格(因条件1不满足)else '不及格' end as math_level, -- 其他→不及格,列别名为math_level-- 英语成绩分级(逻辑同上)case when english >= 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
),适合复杂逻辑。