流程控制与函数
- 一、流程控制
- 1、变量
- 2、分支
- 3、循环
- 1、创建函数
- 2、调用函数
- 3、删除函数
- 4、存储过程和函数
一、流程控制
#流程控制结构
顺序
分支
循环
1、变量
#1、用户变量
#声明并赋值语法:
#SET @变量名=值;
#或
#SET @变量名:=值;
#或
#SELECT @变量名:=值;
#赋值:
#方式一:
#同上述三种
#方式二:
#SELECT 字段|常量|表达式 INTO 变量
#【FROM 表】;
#使用语法:
#SELECT @变量名;
#2、局部变量
#声明的语法:
#DECLARE 变量名 类型 【DEFAULT 值】;
#赋值的语法:
#方式一:
#同上述三种
#方式二:
#SELECT 字段|常量|表达式 INTO 变量
#【FROM 表】;
#使用语法:
#SELECT 变量名;
#注意:用户变量和局部变量的区别
#作用域 声明位置
#用户变量 比较大 可以在BEGIN END 的外面也可以在里面
#局部变量 只能在声明该变量的BEGIN END中 只能在BEGIN END 的里面
mysql > set @name:=’tom’
mysql>select beauty.name into @name from beauty where id = 1
mysql>select @name
mysql> delimiter $
mysql>create procedure var_prol()
->begin
->declare id int default 1;
->set id = 10
->select id;
->end $
mysql > call var_prol()
2、分支
#分支结构
#1、IF函数
#语法:
SELECT IF(10>3,‘哈哈’,‘嘎嘎’);
#应用在:BEGIN END 的里面和外面都行
#2、CASE END
#应用在:BEGIN END 的里面和外面都行
#案例:
CREATE PROCEDURE case_pro1(IN score FLOAT)
BEGIN
CASE
WHEN score>90 THEN SELECT ‘A’;
WHEN score>80 THEN SELECT ‘B’;
WHEN score>60 THEN SELECT ‘C’;
ELSE SELECT ‘D’;
END CASE;
END $
call casepro1(100)
#3、CASE END
#类似于switch
#案例:
CREATE PROCEDURE case_pro2(IN myweek INT)
BEGIN
CASE myweek
WHEN 1 THEN SELECT ‘干煸豆角’;
WHEN 2 THEN SELECT ‘糖拌西红柿’;
WHEN 3 THEN SELECT ‘红烧肉’;
ELSE SELECT ‘干煸土豆’;
END CASE;
END $
call case_pro2(1)
#应用在:BEGIN END 的里面和外面都行
#4、IF ELSEIF ELSE
#类似于多重IF
#语法:
#IF 条件1 THEN 语句1;
#ELSEIF 条件2 THEN 语句2;
#ELSEIF 条件3 THEN 语句3;
#ELSE 语句n;
#END IF ;
#案例:
CREATE PROCEDURE if_pro1(IN score FLOAT)
BEGIN
IF score>90 THEN SELECT ‘A’;
ELSEIF score>80 THEN SELECT ‘B’;
ELSEIF score>60 THEN SELECT ‘C’;
ELSE SELECT ‘D’;
END IF;
END $
call if_pro1(67)
#应用在:只能应用在BEGIN END中
3、循环
#三、循环结构
#1、WHILE结构
#语法:
#【标签:】WHILE 循环条件 DO
#循环体;
#END WHILE 【标签】;
#案例:
#没有使用标签
CREATE PROCEDURE loop_pro1(IN mycount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=mycount DO
SELECT i;
SET i=i+1;
END WHILE;
END $
CALL lopp_pro1(10) $
#使用标签
CREATE PROCEDURE loop_pro2(IN mycount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=mycount DO
SELECT i;
SET i=i+1;
END WHILE a;
END $
CALL lopp_pro2(10) $
#使用标签+leave(break)
CREATE PROCEDURE loop_pro3(IN mycount INT,OUT result INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE SUM INT DEFAULT 0;
a:WHILE i<=mycount DO
SET SUM = SUM+i;
IF SUM>20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
SELECT SUM INTO result;
END $
CALL loop_pro3(10,@r) $
SELECT @r $
#2、REPEAT结构
#语法:
#【标签:】REPEAT
#循环体;
#UNTIL 结束条件 END REPEAT 【标签】;
#案例:
#无标签
CREATE PROCEDURE loop_pro4(IN mycount INT)
BEGIN
DECLARE i INT DEFAULT 1;
REPEAT
SELECT i;
SET i=i+1;
UNTIL i>mycount END REPEAT;
END $
CALL loop_pro4(4) $
#1.没有使用leave
CREATE PROCEDURE loop_pro5(IN mycount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:REPEAT
SELECT i;
SET i=i+1;
UNTIL i>mycount END REPEAT a;
END $
CALL loop_pro5(4) $
#2.使用leave
CREATE PROCEDURE loop_pro6(IN mycount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:REPEAT
SELECT i;
IF i=2 THEN LEAVE a;
END IF;
SET i=i+1;
UNTIL i>mycount END REPEAT a;
END $
CALL loop_pro6(10)
#while和repeat的对比
#执行顺序 循环条件 语法不同
#WHILE 先判断后执行 循环成立的条件 WHILE关键字
#REPEAT 先执行后判断 循环结束的条件 REPEAT关键字
二、函数
#函数
学过的:length()/substr()/instr()/concat()
好处同存储过程
1、创建函数
#语法:
#CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
#BEGIN
#函数体;
#END
#返回类型 方法名(参数列表){
#方法体
#}
#案例1:根据女神编号,返回男神名称
CREATE FUNCTION my_f1(id INT) RETURNS VARCHAR(20)
BEGIN
DECLARE bname VARCHAR(20);
SELECT boys.
boyName
INTO bname
FROM beauty ,boys
WHERE beauty.
boyfriend_id
=boys.
id
AND beauty.
id
=id;
RETURN bname;
END$
SELECT my_f1(8) $
2、调用函数
#SELECT 函数名(参数);
3、删除函数
#DROP FUNCTION 函数名;
4、存储过程和函数
#功能 关键字 返回值 调用语法
#存储过程 提高效率和重用性 PROCEDURE 可以有0个或多个 CALL 存储过程名()
#函数 同上 FUNCTION 只能有一个 SELECT 函数名()