一、存储过程
1、定义
存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字和参数来执行,并获得相应的结果。
应用程序通过存储过程操作表。

2、特点
(1)封装性:将业务逻辑封装在数据库内部,减少应用程序的复杂性
(2)可维护性:集中管理数据库操作,便于维护和更新。若表结构发生修改,不需要修改应用程序,而是修改存储过程。
(3)可重用性:可以多次被调用,提高代码的重用性。
3、优缺点
3.1优点
(1)性能优化:存储过程在创建时编译编译并存在数据库中,执行速度比单个SQL语句快。
(2)代码重用:存储过程可以重复调用,减少重复代码,提高代码的可维护性。
(3)安全性:可以限制用户直接访问数据库,通过存储过程间接访问,保证系统安全性。
(4)事务管理:可以在存储过程中实现复杂的事务逻辑。
(5)降低耦合:表结构发生变化,只需要修改存储过程,应用程序的修改较小。
3.2缺点
(1)可移植性差:不同数据库的实现可能有所不同,存储过程不能实现跨数据库移植,更换数据库需要重新编写。
(2)调试困难:只有少数数据库管理系统支持存储过程的调试和可视化界面,开发和维护困难。
(3)不适合高并发场景:在高并发场景下,存储过程可能会增加数据库的压力,难以维护。
4、环境准备


5、语法
5.1创建
-- 修改SQL语句的结束标识符为//
delimiter //
create procedure 存储过程名 (参数列表)
begin
--sql 语句
end
-- 修改SQL语句的结束标识符为; (使用之后还原
delimiter ;
5.2调用
call 存储过程名 (参数列表);
5.3查看
-- 查看指定数据库中创建的存储过程
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA='表名';
-- 查看创建存储过程的sql
SHOW CREATE PROCEDURE 存储过程名;
-- 查看创建表的SQL
SHOW CREATE TABLE 表名;
5.4删除
-- 删除存储过程名
DROP PROCEDURE IF EXISTS 存储过程名;
5.5示例
计算学生总分


6、变量
6.1系统变量
MySQL的配置变量,控制服务器的行为和性能,分为全局变量 、会话变量
(1)查看系统变量
-- 查看所有系统变量,不指定则默认是session
show [global|session] variables;
-- 查看指定的系统变量,like模糊查询
show [global|session] variables like 'xxx';
-- 查看指定的系统变量,精确查询
show @@[global|session].系统变量名;
(2)设置系统变量
修改session级别的值不影响全局变量的值,开启下一个会话后还是读取全局变量的值
set [global|session] 系统变量名 = 值;
set @@session.系统变量名 = 值;
6.2用户定义变量
在SQL中会话中定义的变量,作用域为当前会话。
(1)赋值
-- 方式1:推荐
set @var_name:=expr [,@var_name]...;
-- 方式2
select 列名 into @var_name from 表名 where ...;
(2)使用
SET @age=18;
SELECT @age;
SET @age:=19;
SELECT @19;
select @age:=20;
SELECT count(*) into @stu_count from student;
select @stu_count;
SET @age:=18;
SELECT * FROM student WHERE age=@age;
6.3局部变量
只在存储过程、函数或触发器的范围内有效,需要使用declare声明,作用域的范围在声明的begin...end代码块内
(1)声明
declare 变量名 变量类型 [default 默认值] ...;
(2)赋值
-- 方式1
set var_name=值;
-- 方式2
set var_name:=值;
-- 方式3
select 列名 into var_name from 表名 where ...;
(3)使用
delimiter //
-- 创建存储过程
CREATE PROCEDURE p1()
BEGIN
-- 定义局部变量
DECLARE stu_count INT DEFAULT 0;
-- 把查询结果赋值到局部变量
SELECT count(*) INTO stu_count from student;
-- 使用(查看)局部变量
SELECT stu_count;
END//
delimiter ;
CALL p1();
7、SQL编程
7.1条件判断
if 条件1 then
......
[elseif 条件2 then
......
else
......]
end if;
使用
delimiter //
CREATE PROCEDURE p2()
BEGIN
-- 定义初始分数变量
DECLARE score int DEFAULT 0;
-- 定义结果变量
DECLARE result VARCHAR(10);
if score>=90 THEN
set result:='优秀';
ELSEIF score>=80 and score<90 THEN
set result:='良好';
ELSEIF score>=60 and score<80 THEN
set result:='及格';
ELSE
set result:='不及格';
END IF;
-- 查询结果
SELECT result;
END//
delimiter ;
CALL p2();
7.2传入参数
