• 第一个语句中case_value与后面各句的when_value依次做相等的对比,如果碰到相等的,则执行对应的后面的statement_list,否则接着对比,
如果都没有匹配,则执行else后面的statement_list • 第二个语句中当search_condition满足true/1的结果时,则执行对应的statement_list,否则执行else对应的statement_list • Statement_list可以包含一个或多个SQL语句SELECT *, ( CASE stusex WHEN 0 THEN 'boy' WHEN 1 THEN 'girl' ELSE 'bu nan bu nv' END ) '性别' FROM tb_student;
也能写成这个例子
SELECT *, ( CASE WHEN stusex=0 THEN 'boy' WHEN stusex=1 THEN 'girl' ELSE 'bu nan bu nv' END ) '性别' FROM tb_student;
在存储过程中使用
drop PROCEDURE if EXISTS student2 ; delimiter // create PROCEDURE student2 (OUT ret VARCHAR(15),IN stuid_num int) BEGIN DECLARE V int; set V=stuid_num; case when v <= 1099 then update tb_student2 set `comment`='三年级学生' where stuid=v;select '三年级学生' into ret; when v > 1099 && v < 2099 then update tb_student2 set `comment`='二年级学生' where stuid=v;set @ret = '二年级学生'; else update tb_student2 set `comment`='一年级学生' where stuid=v;select '一年级学生' into ret; end CASE; END; // delimiter ;
call student2(@ret,1378); select @ret;
流程控制IF语句 • IF语句在存储过程或函数中表明了基础的条件选择语句
• IF语句中如果search_condition满足true/1的条件,则执行对应的statement_list,否则再判断elseif中的search_condition是否满足true/1的条件,如果都不满足则执行else中的statement_list语句
• Statement_list中可以包含一个或多个SQL语句DROP FUNCTION IF EXISTS compare_20; delimiter // CREATE FUNCTION compare_20 (n INT, m INT) RETURNS VARCHAR (30) BEGIN DECLARE s VARCHAR (20) ; IF n > m THEN SET s = '>' ; ELSEIF n = m THEN SET s = '=' ; ELSE SET s = '<' ; END IF ; SET s = concat(n, ' ', s, ' ', m) ; RETURN s ; END// delimiter ;
mysql> select compare_20(3,4); +-----------------+ | compare_20(3,4) | +-----------------+ | 3 < 4 | +-----------------+ 1 row in set, 2 warnings (0.01 sec) mysql>
流程控制iterate语句 • Iterate语句仅出现在loop,repeat,while循环语句中,其含义表示重新开始此循环
• Label表示自定义的标签名
流程控制leave语句 • Leave语句表明退出指定标签的流程控制语句块 • 通常会用在begin…end,以及loop,repeat,while的循环语句中• Label表明要退出的标签名
流程控制loop语句 • Loop语句是存储过程或函数中表达循环执行的一种方式• 其中的statement_list可以包含一个或多个SQL语句
DELIMITER // DROP PROCEDURE IF EXISTS test ; CREATE PROCEDURE test () BEGIN DECLARE i INT ; SET i = 0 ; lp : #lp为循环体名,可随意 loop为关键字 LOOP INSERT INTO test (sno, text, putsff)# 往test表添加数据 VALUES (i + 12, 'test', 20) ; SET i = i + 1 ;# 循环一次,i加一 IF i > 10 THEN# 结束循环的条件: 当i大于10时跳出loop循环 LEAVE lp ; END IF ; END LOOP ; SELECT * FROM test ; END // CALL test(); DELIMITER ;
流程控制repeat语句 • repeat语句是存储过程或函数中表达循环执行的一种方式 • Repeat语句中statement_list一直重复执行直到search_condition条件满足 • Statement_list可以包含一个或多个SQL语句
DROP FUNCTION IF EXISTS fun_test; delimiter // CREATE FUNCTION fun_test (p INT) RETURNS INT BEGIN DECLARE x int; SET x = 100 ; REPEAT SET p = p + 1 ; UNTIL p > x END REPEAT ; RETURN p ; END// delimiter ;
mysql> select fun_test(10); +--------------+ | fun_test(10) | +--------------+ | 101 | +--------------+ 1 row in set (0.00 sec) mysql>
流程控制while语句 • while语句是存储过程或函数中表达循环执行的一种方式 • 当search_condition返回为true时,则循环执行statement_list中的语句,直到search_condition的结果返回为false • Statement_list中可以包含一个或多个SQL语句 流程控制return语句 • Return语句用在函数中,用来终结函数的执行并将指定值返回给调用者
• 在函数中必须要有至少一个return语句,当有多个return语句时则表明函数有多种退出的方式