13、函数、流程控制结构

函数

简介

-- 函数
/*
和存储过程具有类似的功能。

函数和存储过程的区别
	存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
	函数:有且仅有一个返回,适合做处理数据后返回一个结果
*/

-- 一、创建语法
DELIMITER $$

CREATE
    FUNCTION 函数名(参数列表)
    RETURNS 返回类型
    BEGIN
		函数体;
    END$$

DELIMITER ;
/*
注意:
1、参数列表包含两部分,参数名 参数类型,没有IN/OUT/INOUT;
2、函数体肯定有return语句,如果没有会报错;
*/
-- 二、调用语法
SELECT 函数名(参数列表);

函数的使用

-- 三、HelloWorld
-- 案例:返回student表中的学生个数
DELIMITER $$
CREATE
	FUNCTION myFunction1()
	RETURNS INT
	BEGIN
		DECLARE num INT DEFAULT 0;
		SELECT COUNT(*) INTO num FROM student;
		RETURN num;
	END $$
DELIMITER ;

# 调用函数
SELECT myFunction1();
/*
myFunction1()
3
*/

-- 案例:返回两数之和
DELIMITER $$
CREATE
	FUNCTION myFunction2(a INT, b INT)
	RETURNS INT
	BEGIN
		DECLARE c INT;
		SET c = a + b;
		RETURN c;
	END $$
DELIMITER ;

SELECT myFunction2(1,2);
/*
myFunction2(1,2)
3
*/

-- 案例:根据id返回学生姓名
DELIMITER $$
CREATE
	FUNCTION myFunction3(id INT)
	RETURNS VARCHAR(20)
	BEGIN
		DECLARE uname VARCHAR(20);
		SELECT username INTO uname FROM student WHERE student.`id` = id; 
		RETURN uname;
	END $$
DELIMITER ;

SELECT myFunction3(5);
/*
myFunction3(5)
阿乐
*/

函数的查看和删除

-- 四、函数的查看和删除
SHOW CREATE FUNCTION myFunction3;

DROP FUNCTION myFunction1;

流程控制结构

简介

-- 流程控制结构
/*
顺序结构:从上往下执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码
*/

CASE结构

-- 一、分支结构
# if函数在常见函数中的流程控制函数已经讲过

# case结构:只能放在BEGIN...END中
# 类似于Java的switch结构
CASE 变量|表达式|字段
WHEN1 THEN 语句;
WHEN2 THEN 语句;
...
ELSE 语句;
END CASE;

# 类似于Java的多重IF语句,一般用于实现区间判断
CASE 
WHEN 条件表达式1 THEN 语句;
WHEN 条件表达式2 THEN 语句;
...
ELSE 语句;
END CASE;

# 案例:创建存储过程,根据传入的成绩显示等级
DELIMITER $$
CREATE
	PROCEDURE myProcedure5(IN score INT, OUT grade CHAR)
	BEGIN
		CASE
		WHEN score > 90 AND score <= 100 THEN SET grade = 'A';
		WHEN score > 80 THEN SET grade = 'B';
		WHEN score > 70 THEN SET grade = 'C';
		WHEN score > 60 THEN SET grade = 'D';
		ELSE SET grade = 'E';
		END CASE;
	END $$
DELIMITER ;

SET @grade:='';
CALL myProcedure5(82, @grade);
SELECT @grade;
# B

IF结构

# if结构:只能放在BEGIN...END中
IF 条件表达式 THEN 语句;
ELSEIF 条件表达式 THEN 语句;
ELSEIF 条件表达式 THEN 语句;
ELSE 语句;
END IF;

# 案例:创建函数,根据传入的成绩显示等级
DELIMITER $$
CREATE
	FUNCTION myFunction4(score INT)
	RETURNS CHAR
	BEGIN
		DECLARE grade CHAR;
		IF score > 90 AND score <= 100 THEN SET grade:='A';
		ELSEIF score > 80 THEN SET grade:='B';
		ELSEIF score > 70 THEN SET grade:='C';
		ELSEIF score > 60 THEN SET grade:='D';
		ELSE SET grade:='E';
		END IF;
		RETURN grade;
	END $$
DELIMITER ;

SELECT myFunction4(92);

/*
myFunction4(92)
A
*/

WHILE结构

-- 二、循环结构
-- while、loop、repeat
-- 循环控制:leave:相当于Java的break  iterate:相当于Java的continue

# while
WHILE 循环条件 DO
	循环体;
END WHILE;


# loop
[标签]: LOOP 
	循环体;
END LOOP;
# 可以用来模拟简单的死循环,还可以搭配leave使用

# repeat
REPEAT
	循环体
	UNTIL 结束循环的条件
END REPEAT;

# 案例1、计算1-100的和
DELIMITER $$
CREATE 
	FUNCTION myFunction()
	RETURNS INT
	BEGIN
		DECLARE res INT DEFAULT 0;
		DECLARE i INT DEFAULT 1;
		WHILE i <= 100 DO
			SET res:= res + i;
			SET i:= i + 1;
		END WHILE;
		RETURN res;
	END $$
DELIMITER ;

SELECT myFunction();
/*
myFunction()
5050
*/

Loop结构

#计算1-100偶数的和
DELIMITER $$
CREATE 
	FUNCTION myFunction5()
	RETURNS INT
	BEGIN
		DECLARE res INT DEFAULT 0;
		DECLARE i INT DEFAULT 1;
		myloop: LOOP
			IF i = 101 THEN LEAVE myloop;
			ELSEIF i % 2 = 0 THEN SET res:= res + i;
			END IF;
			SET i:= i + 1;
		END LOOP;
		RETURN res;
	END $$
DELIMITER ;

SELECT myFunction5();
/*
myFunction5()
2550
*/

Repeat结构

# 案例:计算1-100偶数的和
DELIMITER $$
CREATE
	FUNCTION myFunction8()
	RETURNS INT
	BEGIN
		DECLARE res INT DEFAULT 0;
		DECLARE i INT DEFAULT 1;
		myrepeat: REPEAT
			IF i % 2 = 1 THEN SET i:= i + 1; ITERATE myrepeat;
			ELSE SET res:= res + i;
			END IF;
			SET i:= i + 1;
			UNTIL i=101
		END REPEAT;
		RETURN res;
	END $$
DELIMITER ;

SELECT myFunction8();
/*
myFunction8()
2550
*/

猜你喜欢

转载自blog.csdn.net/ShawnYue_08/article/details/107881258
今日推荐