什么是MySQL存储过程和函数
存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合
存储过程和函数的好处
存储过程和函数可以重复使用,减轻开发人员的工作量。类似于java中方法可以多次调用减少网络流量,存储过程和函数位于服务器上,调用的时候只需要传递名称和参数即可减少数据在数据库和应用服务器之间的传输,可以提高数据处理的效率将一些业务逻辑在数据库层面来实现,可以减少代码层面的业务处理
存储过程和函数的区别
函数必须有返回值存储过程没有返回值
数据准备
建表语句
-- 创建学生表 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);
注意:下面的案例都是这个表为标准进行举例操作
怎么样创建存储过程?
-- 修改分隔符为$ DELIMITER $ CREATE PROCEDURE 存储过程名称(参数...) BEGIN sql语句; END$ DELIMITER;
代码演示:
执行完以上的命令之后,你的数据库操作界面会多出一个这个
怎么样调用存储过程?
CALL 存储过程名称(实际参数);
代码演示
执行完以上的命令之后,结果是:
怎么样查看存储过程?
SELECT * FROM mysql.proc WHERE db='数据库名称';
怎么样删除存储过程
DROP PROCEDURE [IF EXISTS] 存储过程名称;
存储过程中的语法介绍
定义变量
DECLARE 变量名 数据类型 [DEFAULT 默认值];
代码实现:
变量赋值操作
方式一: SET 变量名 = 变量值; 方式二: SELECT 列名 INTO 变量名 FROM 表名 [WHERE 条件];
代码实现
存储过程带参数的传递的写法
DELIMITER $ CREATE PROCEDURE 存储过程名称([IN|OUT|INOUT] 参数名 数据类型) BEGIN 执行的sql语句; END$ DELIMITER ;
IN:代表输入参数,需要由调用者传递实际数据。默认的
OUT:代表输出参数,该参数可以作为返回值
INOUT:代表既可以作为输入参数,也可以作为输出参数
输入参数的写法:
DELIMITER $ CREATE PROCEDURE 存储过程名称(IN 参数名 数据类型) BEGIN 执行的sql语句; END$ DELIMITER ;
输入参数的写法怎么调用?
CALL 存储过程名称(参数); --你的参数类型是什么,你调用的时候直接写对应的参数就好。
代码实现:
输出参数的写法:
DELIMITER $ CREATE PROCEDURE 存储过程名称(OUT 参数名 数据类型) BEGIN 执行的sql语句; END$ DELIMITER ;
输出参数的写法怎么调用?
CALL 存储过程名称(@变量名); --@变量名 表示执行完这个存储过程的语句后,返回的结果保存的到@变量名中 SELECT @变量名; --通过SELECT语句查询该变量的值。
@变量名: 这种变量要在变量名称前面加上“@”符号,叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。
@@变量名: 这种在变量前加上 "@@" 符号, 叫做系统变量
代码实现:
if语句的使用
IF 判断条件1 THEN 执行的sql语句1; [ELSEIF 判断条件2 THEN 执行的sql语句2;] ... [ELSE 执行的sql语句n;] END IF;
代码实现:
case语句的使用
写法1: CASE 表达式 WHEN 值1 THEN 执行sql语句1; [WHEN 值2 THEN 执行sql语句2;] ... [ELSE 执行sql语句n;] END CASE; 写法2: CASE WHEN 判断条件1 THEN 执行sql语句1; [WHEN 判断条件2 THEN 执行sql语句2;] ... [ELSE 执行sql语句n;] END CASE;
代码实现:
while循环
初始化语句; WHILE 条件判断语句 DO 循环体语句; 条件控制语句; END WHILE;
代码实现:
repeat循环
初始化语句; REPEAT 循环体语句; 条件控制语句; UNTIL 条件判断语句 END REPEAT;
代码实现:
loop循环
初始化语句; [循环名称:] LOOP 条件判断语句 [LEAVE 循环名称;] 循环体语句; 条件控制语句; END LOOP 循环名称;
代码实现:
注意:
loop可以实现简单的循环,但是退出循环需要使用其他的语句来定义。我们可以使用leave语句完成!如果不加退出循环的语句,那么就变成了死循环。
游标
游标的概念
-
游标可以遍历返回的多行结果,每次拿到一整行数据
-
在存储过程和函数中可以使用游标对结果集进行循环的处理
-
简单来说游标就类似于集合的迭代器遍历
-
MySQL中的游标只能用在存储过程和函数中
游标的语法
创建游标
DECLARE 游标名称 CURSOR FOR 查询sql语句;
打开游标
OPEN 游标名称;
使用游标获取数据
FETCH 游标名称 INTO 变量名1,变量名2,...;
关闭游标
CLOSE 游标名称;
需求:新建一张表yb_name,然后通过游标的方式查询上面的student表中的所有姓名保存到yb_name表中。
代码实现:
创建yb_name表
CREATE TABLE yb_name( id INT PRIMARY KEY AUTO_INCREMENT, name varchar(20));
游标方式操作表的代码实现:
存储函数
存储函数和存储过程是非常相似的。存储函数可以做的事情,存储过程也可以做到!存储函数有返回值,存储过程没有返回值(参数的out其实也相当于是返回数据了)
创建存储函数
DELIMITER $ CREATE FUNCTION 函数名称([参数 数据类型]) RETURNS 返回值类型 BEGIN 执行的sql语句; RETURN 结果; END$ DELIMITER ;
调用存储函数
SELECT 函数名称(实际参数);
删除存储函数
DROP FUNCTION 函数名称;
代码实现:
转自https://mp.weixin.qq.com/s/A07hET2-qwASOYksRlo9jA