函数
函数只能且仅有一个返回值
#创建语法
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
参数列表
参数名 参数类型
函数体
肯定要有return语句
函数体只有一句话时,可以省略begin end
使用delimiter语句设置结束标志
#调用语法
select 函数名(参数列表)
#案例
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;
SELECT COUNT(*) INTO c
FROM employees;
RETURN c;
END $
SELECT myf1()$
#查看函数
show create function myf3
#删除函数
DROP FUNCTION myf4
流程控制结构
顺序结构
从上向下依次执行
分支结构
从两条或多条路径中选择一条
if函数
select if(表达1,表达2,表达3)
1成立返回2,否则返回3
case函数
#方式一
case 变量|表达式|字段
when 要判断的值 then 返回的值1或语句;
...
else 要返回的值n(可以省略)
end
#方式二
case
when 要判断的条件 then 返回的值1或语句;
...
else 要返回的值n(可以省略)
end
可以作为表达式,嵌套其他语句使用,可以放在任何地方,
也可以作为独立语句使用,只能放在begin end中使用
在当作独立语言时,
如果when中值满足或条件成立,则执行对应的then后的语句,并且结束case
如果都不满足,执行else中的语句或值,
如果都不满足,返回null.
CREATE PROCEDURE test_case(IN score INT)
BEGIN
CASE
WHEN score>=90 AND score<=100 THEN SELECT 'A';
WHEN score>=80 THEN SELECT 'B';
WHEN score>=70 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE;
END $
CALL test_case(95)$
if结构
只能应用于begin end中
#语法
if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句;(可省略)
end if;
#案例
CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
IF score>=90 AND score<=100 THEN RETURN 'A';
ELSEIF score>=80 THEN RETURN 'B';
ELSEIF score>=70 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END $
SELECT test_if(95)$
循环结构
只能在begin end 中
在满足一定条件的基础上,重复执行一段代码
分类:while, 先判断后执行
loop,无条件后判断
repeat,先执行后判断
循环控制:
iterate:结束本次循环,继续下一次
leave:跳出循环,结束所在的循环
while
#语法
[标签:]while 循环条件 do
循环体;
end while [标签];
#案例
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i <= insertCount DO
INSERT INTO admin(username,`password`)
VALUES('Rose','6666');
SET i=i+1;
END WHILE;
END $
#案例 leave
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i <= insertCount DO
INSERT INTO admin(username,`password`)
VALUES(CONCAT('Rose',i),'6666');
IF i >= 20 THEN LEAVE a;#要使用循环控制必须要加标签
END IF;
SET i=i+1;
END WHILE a;
END $
#案例 iterate
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i <= insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;#iterate使用
END IF;
INSERT INTO admin(username,`password`)
VALUES(CONCAT('Rose',i),'6666');
END WHILE a;
END $
#案例
CREATE PROCEDURE test_ranstr_insert(IN insertcount INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startindex INT DEFAULT 1;
DECLARE len INT DEFAULT 1;
WHILE i<=insertcount DO
SET startindex=FLOOR(RAND()*26+1);
SET len=FLOOR(RAND()*(20-startindex+1)+1);
INSERT INTO stringcontent(content)
VALUES( SUBSTR(str,startindex,len));
SET i=i+1;
END WHILE;
END $
loop
可以模拟简单的死循环
#语法
[标签:]loop
循环体;
end loop [标签];
repeat
#语法
[标签:]repeat
循环体;
until 结束循环的条件
end repeat [标签];