条件分支语句
条件分支语句是通过对特定条件的判断,选择一个分支的语句执行。SQL中可以实现条件分支的语句有4种:
- IF
- IFNULL
- IF…ELSE
- CASE
1. IF语句
是三目运算符
IF(条件表达式,结果1,结果2);
解释:当“条件表达式”的值为TRUE时,返回“结果1”,否则返回“结果2”
-- IF语句
SELECT uName, IF(uEmail IS null, 'nothing', uEmail) AS uEmail
FROM users
-- 输出前5条记录
LIMIT 5;
2. IFNULL语句
是双目运算符
IFNULL(结果1,结果2);
解释:若结果1的值不为空,则返回结果1,否则返回结果2
-- IFNULL语句
SELECT gdName, ifnull(gdInfo,'no gdinfo') as gdInfo
FROM goods
LIMIT 5;
3. IF…ELSE
语法:
IF 条件表达式1 THEN 语句块1;
[ELSEIF 条件表达式2 THEN
语句块2;]
…[ELSE
语句块m;]
END IF;
解释:当“条件表达式1”的值为TRUE时,“语句块1”将被执行;若没有“条件表达式”的值为TRUE,则执行“语句块m”,每个语句块都可以包含一个或多个语句
注意:IF…ELSE语句只用在存储过程的BEGIN END代码块中
-- IF...ELSE语句
CREATE PROCEDURE sp_ltf9()
BEGIN
DECLARE c INT DEFAULT 0;
-- 从订单表中查询所有uID=3的订单给变量c
SELECT COUNT(*) into c
FROM orders WHERE uID = 3;
IF C > 0 THEN SELECT "有订单";
ELSE
SELECT "无订单";
END IF;
END
CALL sp_ltf9();
4. CASE语句
CASE语句在SQL中用于实现分支处理,能够根据表达式的不同取值,转向不同的计算或处理,类似高级语言中的switch…case语句
(1)简单CASE结构
- 简单CASE结构将表达式与一组简单表达式进行比较以确定结果
语法:
CASE 表达式
WHEN 数值1 THEN
语句1;
[WHEN 数值2 THEN
语句2;]…
[ELSE
语句n+1;]END CASE;
-- CASE语句
SELECT uName, uSex,
-- 性别男对应的SexValue值为1,
-- 性别女对应的SexValue值为0。
CASE uSex
WHEN '男' THEN 1
ELSE 0
END AS SexValue
FROM users
LIMIT 5;
(2)CASE搜索结构
- CASE搜索结构用于搜索条件表达式以确定相应的操作
语法:
CASE
WHEN 条件表达式1 THEN
语句1;
[WHEN 条件表达式2 THEN
语句2;]…
[ELSE
语句n+1;]END CASE;
解释:该结构判断WHEN子句后的“条件表达式”的值是否为TRUE,若为TRUE,则执行对应的“语句”,若所有的“条件表达式”的值均为FALSE,则执行ELSE后的“语句”。若无ELSE子句,则返回NULL。
-- 2.CASE搜索结构
SELECT uName, uCredit,
CASE
WHEN uCredit >= 200 THEN "金牌会员"
WHEN uCredit >= 100 THEN "银牌会员"
ELSE "铜牌会员"
END AS grade
FROM users
循环语句
MySQL中的循环语句只有WHILE、REPEAT和LOOP三种
1.WHILE语句
语法:
[开始标签:] WHILE 条件表达式 Do
语句块;
END WHILE [结束标签];
解释:WHILE语句内的语句块被重复执行,直至“条件表达式”的值为FALSE;只有“开始标签”语句存在,“结束标签”语句才能被使用;若两者都存在,它们的名称必须相同;“语句块”表示需要循环执行的语句
-- WHILE循环
CREATE PROCEDURE sp_ltf5()
BEGIN
SET @count := 1; -- 定义变量count且初始值为1
SET @sum := 0; -- 定义变量sum且初始值为0
WHILE @count <= 100 DO
SET @sum = @sum + @count;
SET @count = @count + 1;
END WHILE;
SELECT @sum;
END;
CALL sp_ltf5()
2.LOOP语句
LOOP语句可以使某些特定的语句重复执行,实现一个简单的循环。但是LOOP语句本身没有停止循环的语句,必须和LEAVE语句结合使用才能停止循环。否则,该循环就成了一个死循环
语法:
[开始标签:] LOOP
语句块;
END LOOP [结束标签];
解释:“开始标签”参数和“结束标签”参数分别表示循环开始和结束的标识,这两个标识必须相同,可以省略;“语句块”表示需要循环执行的语句
3.LEAVE语句
LEAVE语句主要用于跳出循环控制,与高级语言中的BREAK语句相似
语法:
LEAVE 标签名;
解释:“标签名”用于标识跳出的循环
4.ITERATE语句
ITERATE语句也可用于跳出循环,与高级语言中的CONTINUE语句相似;ITERATE语句只跳出本次循环,然后直接进入下一次循环
语法:
ITERATE 标签名;
解释:“标签名”表示循环的标识
5.REPEAT语句
REPEAT语句是有条件控制的循环语句,当满足特定条件时,就会跳出循环语句。
语法:
[开始标签:] REPEAT
语句块; UNTILL 条件表达式;
END REPEAT [结束标签]
解释:UNTILL关键字表示直到满足“条件表达式”时结束循环