数据库原理与应用 第 15 章 · 第四节
课程 › 第 15 章 › 第四节 IF 语句CASE 语句WHILE 与 REPEATLOOP 版式
第 15 章 存储过程与函数 · 第四节

流程控制语句

IF、CASE 两种分支语句,WHILE、REPEAT、LOOP 三种循环语句,LEAVE 和 ITERATE
本 节 知 识 点
  1. 14IF 语句
  2. 15CASE 语句
  3. 16WHILE 与 REPEAT
  4. 17LOOP、LEAVE 与 ITERATE
14
第 15 章 · 第四节 · 课件第 32、33、34 页合并重做

IF 语句

按条件选择执行的语句,以 END IF 结束。

15.2 MySQL 编程基础课件第 32、33、34 页合并

流程控制与 IF 语句

流程控制语句有 IF、CASE 两种分支语句,WHILE、REPEAT、LOOP 三种循环语句,以及跳出循环的 LEAVE 和 ITERATE。

IF 语句的格式
IF 条件1 THEN 语句列表1 [ELSEIF 条件2 THEN 语句列表2] … [ELSE 语句列表n] END IF;
  • 哪个条件成立就执行哪个语句列表,都不成立时执行 ELSE 后的语句
例 15-1,写成存储过程
DELIMITER $$
CREATE PROCEDURE pass_or_fail(
  IN stu CHAR(4))
BEGIN
  IF (SELECT AVG(score) FROM sc
      WHERE sno = stu) >= 60 THEN
    SELECT stu, 'Pass!';
  ELSE
    SELECT stu, 'Fail!';
  END IF;
END $$
DELIMITER ;

流程控制语句和 BEGIN … END 只能用在存储程序中,单独执行会报错 1064,所以例 15-1 写成存储过程。

15
第 15 章 · 第四节 · 课件第 35、36 页合并重做

CASE 语句

按值匹配或按条件匹配,多分支时比 IF 清楚。

15.2 MySQL 编程基础课件第 35、36 页合并

CASE 语句

格式 1:按值匹配
CASE 表达式 WHEN 值1 THEN 结果1 [WHEN 值2 THEN 结果2] … [ELSE 结果n] END
例 15-2 性别换成 M、F
SELECT sno,
  CASE sex
    WHEN '男' THEN 'M'
    WHEN '女' THEN 'F'
  END AS sex
FROM s;
格式 2:按条件匹配
CASE WHEN 条件1 THEN 结果1 [WHEN 条件2 THEN 结果2] … [ELSE 结果n] END
例 15-3 成绩换成等级
SELECT sno, cno, CASE
  WHEN score IS NULL THEN '未考'
  WHEN score < 60 THEN '不及格'
  WHEN score < 70 THEN '及格'
  WHEN score < 90 THEN '良好'
  ELSE '优秀' END AS 等级
FROM sc;

查询中的 CASE 是表达式,以 END 结束,可以直接执行。在存储程序中作为语句使用的 CASE,THEN 后面是语句列表,以 END CASE 结束。

16
第 15 章 · 第四节 · 课件第 37、38 页合并重做

WHILE 与 REPEAT

WHILE 先判断,REPEAT 先执行。

15.2 MySQL 编程基础课件第 37、38 页合并

WHILE 与 REPEAT

WHILE:先判断,再执行
[标号:] WHILE 条件 DO 语句列表 END WHILE [标号];
例 15-4 求 1+2+…+100
DECLARE i INT DEFAULT 1;
DECLARE total INT DEFAULT 0;
WHILE i <= 100 DO
  SET total = total + i;
  SET i = i + 1;
END WHILE;
SELECT total;   -- 5050
REPEAT:先执行,再判断
[标号:] REPEAT 语句列表 UNTIL 条件 END REPEAT [标号];
例 15-6 1²+2²+…+i² < 1000 的最大 i
DECLARE i INT DEFAULT 0;
DECLARE total INT DEFAULT 0;
REPEAT
  SET i = i + 1;
  SET total = total + i * i;
UNTIL total >= 1000
END REPEAT;
SELECT i - 1;   -- 13
  • WHILE 的条件成立时继续循环,REPEAT 的条件成立时结束循环。REPEAT 的循环体至少执行一次
  • 完整的存储过程见实验 2-5

试一试三种循环在什么时候判断

循环
什么时候判断什么时候结束循环体至少执行

实 验

实验 2-5 WHILE 与 REPEAT

17
第 15 章 · 第四节 · 课件第 39、40 页合并重做

LOOP、LEAVE 与 ITERATE

LOOP 靠 LEAVE 结束,ITERATE 跳过本次。

15.2 MySQL 编程基础课件第 39、40 页合并

LOOP、LEAVE 与 ITERATE

LOOP:没有结束条件的循环
[标号:] LOOP 语句列表 END LOOP [标号];
  • LOOP 自己不会结束,要在循环体中用 LEAVE 跳出,所以一般要加标号
LEAVE 与 ITERATE
语句作用
LEAVE 标号跳出标号所指的循环
ITERATE 标号结束本次循环,直接进入下一次
例:1 到 100 中奇数的和
lp: LOOP
  SET i = i + 1;
  IF i > 100 THEN
    LEAVE lp;
  END IF;
  IF i MOD 2 = 0 THEN
    ITERATE lp;
  END IF;
  SET total = total + i;
END LOOP lp;
  • i 超过 100 时 LEAVE,遇到偶数时 ITERATE 跳过累加
  • 结果为 2500

LEAVE、ITERATE 也可以用在 WHILE 和 REPEAT 中,作用相当于其他语言中的 break 和 continue。

想一想

把例子中 SET i = i + 1 移到最后一行,会怎样?

实 验

实验 2-6 LOOP 与 ITERATE

保山学院·人工智能教研室·曹鼎鼎