流程控制函数
数据库流程函数(Flow Control Functions)主要用于控制 SQL 语句的执行流程,常出现在存储过程(Stored Procedure)、触发器(Trigger)、函数(Function)或脚本中。
1. IF 条件判断
Section titled “1. IF 条件判断”用于在 SQL 中实现分支逻辑判断。
IF(条件, 值1, 值2)-
功能:如果条件为真返回值1,否则返回值2。
-
例子:
SELECT IF(score >= 60, '及格', '不及格') AS result FROM student;
类似于 Java 中的 switch 语句,可实现多分支逻辑。
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ELSE 默认结果END-
功能:逐条判断条件并返回匹配的结果。
-
例子:
SELECT name,CASEWHEN age < 18 THEN '未成年'WHEN age < 60 THEN '成年人'ELSE '老年人'END AS age_groupFROM user;
3. IFNULL / COALESCE 空值处理
Section titled “3. IFNULL / COALESCE 空值处理”3.1. IFNULL
Section titled “3.1. IFNULL”-
表达式:
IFNULL(expr1, expr2) -
功能:如果
expr1不为 NULL,就返回expr1;如果为 NULL,就返回expr2。
常用于处理可能为空的字段,给一个默认值。
- 例子:
SELECT IFNULL(NULL, '默认值'); -- 结果: 默认值SELECT IFNULL('abc', '默认值'); -- 结果: abc3.2. COALESCE
Section titled “3.2. COALESCE”-
表达式:
COALESCE(expr1, expr2, expr3, …) -
功能:
COALESCE(expr1, expr2, ..., exprN)会依次检查传入的表达式,返回 第一个非 NULL 的值。 -
例子:
SELECT COALESCE(address, temp_address, '未知') FROM user;
4. NULLIF 防止除零错误
Section titled “4. NULLIF 防止除零错误”NULLIF(expr1, expr2)-
功能:若 expr1 = expr2,返回 NULL,否则返回 expr1。
-
用途:常用于防止除数为 0。
-
例子:
SELECT score / NULLIF(total, 0) FROM exam;
5. IF / ELSEIF / ELSE(存储过程内使用)
Section titled “5. IF / ELSEIF / ELSE(存储过程内使用)”在存储过程或触发器中使用多层条件判断。
IF condition1 THEN 语句1;ELSEIF condition2 THEN 语句2;ELSE 语句3;END IF;6. WHILE 循环
Section titled “6. WHILE 循环”用于在条件成立时重复执行语句。
WHILE condition DO -- 循环体END WHILE;-
例子:
SET i = 1;WHILE i <= 10 DOINSERT INTO logs VALUES (i, NOW());SET i = i + 1;END WHILE;
7. REPEAT 循环
Section titled “7. REPEAT 循环”至少执行一次循环体,直到条件为真才退出。
REPEAT -- 循环体UNTIL conditionEND REPEAT;8. LOOP 循环 + LEAVE / ITERATE
Section titled “8. LOOP 循环 + LEAVE / ITERATE”8.1. LOOP ... END LOOP
Section titled “8.1. LOOP ... END LOOP”- 无限循环,用
LEAVE退出。
8.2. LEAVE label;
Section titled “8.2. LEAVE label;”- 功能:跳出当前循环。
8.3. ITERATE label;
Section titled “8.3. ITERATE label;”- 功能:跳过当前循环的剩余语句,直接进入下一次循环。
例子:
label1: LOOP SET i = i + 1; IF i > 10 THEN LEAVE label1; -- 跳出循环 END IF;END LOOP label1;9. GOTO(极少使用)
Section titled “9. GOTO(极少使用)”在某些数据库(如 SQL Server)中支持跳转标签。
GOTO label_name;10. SIGNAL / RESIGNAL 异常抛出
Section titled “10. SIGNAL / RESIGNAL 异常抛出”在 MySQL 存储过程中抛出自定义错误。
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '自定义错误信息';例子:
IF total = 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '除数不能为0';END IF;11. RETURN 返回值(函数专用)
Section titled “11. RETURN 返回值(函数专用)”在存储函数中返回一个结果。
RETURN expression;