有了它们,SQL 才算能编程
两种分支、三种循环,外加两个跳转。

试一试六种语句点一行看一个
| 语句 | 什么形状 |
|---|
重 点
这一节是全章的骨头。没有分支和循环,存储过程只是几句 SQL 排排坐。
想一想
为什么普通的 SELECT 里用不上这些语句?
两种分支、三种循环,外加两个跳转。

| 语句 | 什么形状 |
|---|
这一节是全章的骨头。没有分支和循环,存储过程只是几句 SQL 排排坐。
为什么普通的 SELECT 里用不上这些语句?
ELSEIF 可以接很多条,ELSE 兜底。

从上往下逐条判断,中了第一个成立的就跳出去,后面的不再看。
把判断条件的顺序倒过来写,结果会变吗?
课件这一段直接敲跑不了,得先包起来。

课件印的是一段裸的 BEGIN…END。在 mysql> 里 BEGIN 是开事务,后面就报 1064。
把它装进 CREATE PROCEDURE 里就好了。语句块只活在过程和函数里。
s1 的两门课平均多少分?
CASE 字段 WHEN 值 THEN … END。

适合同一个字段有几种固定取值的情况,比一串 ELSEIF 清楚得多。
例 15-2 把 sex 字段的男女换成 M 和 F,一句 SELECT 就做完了。
CASE WHEN 条件 THEN … END,前面不跟字段。

| 格式 | 拿什么配 |
|---|---|
| CASE 字段 | 值相等 |
| CASE 空着 | 条件成立 |
条件里要用到范围、比较、IS NULL 的时候,只能用格式二。
例 15-3 里成绩为空那一支,为什么必须放在最前面?
条件一开始就不成立,一圈都不转。

UNTIL 后面写的是「什么时候停」,不是「什么时候继续」。

不管条件成不成立,REPEAT 至少转一圈,这是它跟 WHILE 唯一的差别。
先敲一下门再看有没有人,和先看有没有人再敲门。
循环体里有 INSERT 的时候,这个差别有多要命?
全靠 LEAVE 跳出来,忘了写就停不下来。

LOOP 前面要给它起个标签,LEAVE 才有地方可跳。
三种循环能做的事情完全一样,会用一种就够,读得懂另外两种即可。
一个是别的语言里的 break,一个是 continue。

| 写法 | 跳到哪 |
|---|---|
| LEAVE 标签 | 整个循环外 |
| ITERATE 标签 | 下一圈开头 |
标签写错在建的时候就报 1308,不用等到调用才发现。
WHILE 先判断后执行,条件一开始不成立就一次都不跑。REPEAT 是先跑后判断。