目录
1.存储过程和函数的概念
-
存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合
2.存储过程和函数的好处
-
存储过程和函数可以重复使用,减轻开发人员的工作量。类似于java中方法可以多次调用
-
减少网络流量,存储过程和函数位于服务器上,调用的时候只需要传递名称和参数即可
-
减少数据在数据库和应用服务器之间的传输,可以提高数据处理的效率
-
将一些业务逻辑在数据库层面来实现,可以减少代码层面的业务处理
3.存储过程和函数的区别
-
函数必须有返回值
-
存储过程没有返回值
4.创建存储过程
-
小知识
-
数据准备
-- 创建db8数据库 CREATE DATABASE db8; -- 使用db8数据库 USE db8; -- 创建学生表 CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, -- 学生id NAME VARCHAR(20), -- 学生姓名 age INT, -- 学生年龄 gender VARCHAR(5), -- 学生性别 score INT -- 学生成绩 ); -- 添加数据 INSERT INTO student VALUES (NULL,'张三',23,'男',95),(NULL,'李四',24,'男',98), (NULL,'王五',25,'女',100),(NULL,'赵六',26,'女',90); -- 按照性别进行分组,查询每组学生的总成绩。按照总成绩的升序排序 SELECT gender,SUM(score) getSum FROM student GROUP BY gender ORDER BY getSum ASC;
-
创建存储过程语法
-
创建存储过程
-- 修改分隔符为$ DELIMITER $ -- 创建存储过程,封装分组查询学生总成绩的sql语句 CREATE PROCEDURE stu_group() BEGIN SELECT gender,SUM(score) getSum FROM student GROUP BY gender ORDER BY getSum ASC; END$ -- 修改分隔符为分号 DELIMITER ;
5.调用存储过程
-
调用存储过程语法
6.查看存储过程
-
查看存储过程语法
7.删除存储过程
- 删除存储过程语法
8.存储过程语法
8.1存储过程语法介绍
-
存储过程是可以进行编程的。意味着可以使用变量、表达式、条件控制语句、循环语句等,来完成比较复杂的功能!
8.2变量的使用
- 定义变量
- 变量的赋值1
- 变量的赋值2
8.3if语句的使用
- 标准语法
- 案例演示:
/* 定义一个int变量,用于存储班级总成绩 定义一个varchar变量,用于存储分数描述 根据总成绩判断: 380分及以上 学习优秀 320 ~ 380 学习不错 320以下 学习一般 */ DELIMITER $ CREATE PROCEDURE pro_test4() BEGIN -- 定义总分数变量 DECLARE total INT; -- 定义分数描述变量 DECLARE description VARCHAR(10); -- 为总分数变量赋值 SELECT SUM(score) INTO total FROM student; -- 判断总分数 IF total >= 380 THEN SET description = '学习优秀'; ELSEIF total >= 320 AND total < 380 THEN SET description = '学习不错'; ELSE SET description = '学习一般'; END IF; -- 查询总成绩和描述信息 SELECT total,description; END$ DELIMITER ; -- 调用pro_test4存储过程 CALL pro_test4();
8.4参数的传递
- 参数传递的语法
- 输入参数
- 标准语法
案例演示:
/* 输入总成绩变量,代表学生总成绩 定义一个varchar变量,用于存储分数描述 根据总成绩判断: 380分及以上 学习优秀 320 ~ 380 学习不错 320以下 学习一般 */ DELIMITER $ CREATE PROCEDURE pro_test5(IN total INT) BEGIN -- 定义分数描述变量 DECLARE description VARCHAR(10); -- 判断总分数 IF total >= 380 THEN SET description = '学习优秀'; ELSEIF total >= 320 AND total < 380 THEN SET description = '学习不错'; ELSE SET description = '学习一般'; END IF; -- 查询总成绩和描述信息 SELECT total,description; END$ DELIMITER ; -- 调用pro_test5存储过程 CALL pro_test5(390); CALL pro_test5((SELECT SUM(score) FROM student));
- 标准语法
- 输出参数
- 标准语法
- 案例演示
/* 输入总成绩变量,代表学生总成绩 输出分数描述变量,代表学生总成绩的描述 根据总成绩判断: 380分及以上 学习优秀 320 ~ 380 学习不错 320以下 学习一般 */ DELIMITER $ CREATE PROCEDURE pro_test6(IN total INT,OUT description VARCHAR(10)) BEGIN -- 判断总分数 IF total >= 380 THEN SET description = '学习优秀'; ELSEIF total >= 320 AND total < 380 THEN SET description = '学习不错'; ELSE SET description = '学习一般'; END IF; END$ DELIMITER ; -- 调用pro_test6存储过程 CALL pro_test6(310,@description); -- 查询总成绩描述 SELECT @description;
- 小知识:
8.5case语句的使用
- 标准语法1
- 标准语法2
- 案例演示
/* 输入总成绩变量,代表学生总成绩 定义一个varchar变量,用于存储分数描述 根据总成绩判断: 380分及以上 学习优秀 320 ~ 380 学习不错 320以下 学习一般 */ DELIMITER $ CREATE PROCEDURE pro_test7(IN total INT) BEGIN -- 定义变量 DECLARE description VARCHAR(10); -- 使用case判断 CASE WHEN total >= 380 THEN SET description = '学习优秀'; WHEN total >= 320 AND total < 380 THEN SET description = '学习不错'; ELSE SET description = '学习一般'; END CASE; -- 查询分数描述信息 SELECT description; END$ DELIMITER ; -- 调用pro_test7存储过程 CALL pro_test7(390); CALL pro_test7((SELECT SUM(score) FROM student));
8.6while循环
- 标准语法
- 案例演示
/* 计算1~100之间的偶数和 */ DELIMITER $ CREATE PROCEDURE pro_test8() BEGIN -- 定义求和变量 DECLARE result INT DEFAULT 0; -- 定义初始化变量 DECLARE num INT DEFAULT 1; -- while循环 WHILE num <= 100 DO -- 偶数判断 IF num%2=0 THEN SET result = result + num; -- 累加 END IF; -- 让num+1 SET num = num + 1; END WHILE; -- 查询求和结果 SELECT result; END$ DELIMITER ; -- 调用pro_test8存储过程 CALL pro_test8();
8.7repeat循环
- 标准语法
- 案例演示
/* 计算1~10之间的和 */ DELIMITER $ CREATE PROCEDURE pro_test9() BEGIN -- 定义求和变量 DECLARE result INT DEFAULT 0; -- 定义初始化变量 DECLARE num INT DEFAULT 1; -- repeat循环 REPEAT -- 累加 SET result = result + num; -- 让num+1 SET num = num + 1; -- 停止循环 UNTIL num>10 END REPEAT; -- 查询求和结果 SELECT result; END$ DELIMITER ; -- 调用pro_test9存储过程 CALL pro_test9();
8.8loop循环
- 标准语法
- 案例演示
/* 计算1~10之间的和 */ DELIMITER $ CREATE PROCEDURE pro_test10() BEGIN -- 定义求和变量 DECLARE result INT DEFAULT 0; -- 定义初始化变量 DECLARE num INT DEFAULT 1; -- loop循环 l:LOOP -- 条件成立,停止循环 IF num > 10 THEN LEAVE l; END IF; -- 累加 SET result = result + num; -- 让num+1 SET num = num + 1; END LOOP l; -- 查询求和结果 SELECT result; END$ DELIMITER ; -- 调用pro_test10存储过程 CALL pro_test10();