MySQL学习笔记(2)——存储过程与存储函数

MySQL学习笔记(2)——存储过程与存储函数

文章目录

  • MySQL学习笔记(2)——存储过程与存储函数
    • 一、存储过程
      • 1.概念:预先编译好的sql语句的集合,理解成批处理语句
      • 2.好处;
      • 3.语法:
      • 4.参数列表:
      • 5.参数模式:
      • 6.注意事项:
      • 7.调用语法
      • 8.实战
        • (1)参数列表为空
        • (2)参数模式为in类型:
        • (3)参数列表为out类型
        • (4)参数类型为inout类型:
      • 存储过程的其他操作
        • 删除
        • 显示存储过程
        • 注意:
    • 二、存储函数
      • 1.存储过程与存储函数的区别:
      • 2.语法
        • 2.1创建函数语法:
        • 2.2调用语法:
        • 2.3查看函数
        • 2.4删除函数
        • 2.5注意事项:
      • 3.实战
        • 3.1无参数有返回
        • 3.2有参数有返回值
        • 3.3 小练习
  • 结语

一、存储过程

1.概念:预先编译好的sql语句的集合,理解成批处理语句

2.好处;

1.提高了代码的复用性
2.简化操作
3.减少了编译次数和数据库服务器的次数,提高了效率

3.语法:

create procedure 存储过程名称(参数模式 参数名 参数类型)
begin
存储过程体
end

4.参数列表:

参数列表包含三部分:
参数模式 参数名 参数类型
举例
in stuname varchar(32)

5.参数模式:

in 该参数可以作为输入,需要调用方传入值
out 该参数可以作为输出,可以作为返回值
inout 改参数及可以作为输入、又可以作为输出

6.注意事项:

1.如果存储过程仅仅只有一句话,那么begin end可以省略
2.存储过程体中的每条sql语句的结果必须加上分号’;’
3.存储过程的结果可以使用delemiter 重新设置
语法:
delimiter 结束标记
例:delimiter //

7.调用语法

call 存储过程名(实参列表);

8.实战

(1)参数列表为空

练习:
1.批量插入数据
DELIMITER //
CREATE PROCEDURE pro1()
BEGIN
	INSERT INTO stu(id,NAME) VALUES(NULL,'jack');
	INSERT INTO stu(id,NAME) VALUES(NULL,'tom');
	INSERT INTO stu(id,NAME) VALUES(NULL,'mike');
	INSERT INTO stu(id,NAME) VALUES(NULL,'rose');
END;
//
-- 调用
CALL pro1();
SELECT * FROM stu;

MySQL学习笔记(2)——存储过程与存储函数_第1张图片

(2)参数模式为in类型:

-- 有参数
DELIMITER //
CREATE PROCEDURE pro2(IN t_name VARCHAR(32))
BEGIN
	SELECT * FROM stu WHERE NAME = t_name;
END;
//

-- 调用
CALL pro2('jack');

SELECT * FROM stu;

MySQL学习笔记(2)——存储过程与存储函数_第2张图片

DELIMITER //
CREATE PROCEDURE pro3(IN id INT,IN NAME VARCHAR(32))
BEGIN
	DECLARE result VARCHAR(32) DEFAULT '';
	
	SELECT COUNT(*)
	INTO result 
	FROM stu 
	WHERE stu.`id`=id AND stu.`name`=NAME;
	
	SELECT result; 
END;
//

-- 调用
CALL pro3(15,'jack');

MySQL学习笔记(2)——存储过程与存储函数_第3张图片

(3)参数列表为out类型

-- out类型
DELIMITER //
CREATE PROCEDURE pro4(IN id INT,OUT NAME VARCHAR(32))
BEGIN
	SELECT stu.`name`
	INTO NAME
	FROM stu 
	WHERE stu.`id`=id;
END;
//

-- 调用
-- 定义一个变量接收返回值
CALL pro4(1,@name);
SELECT @name;

MySQL学习笔记(2)——存储过程与存储函数_第4张图片

-- 有两个out类型返回值
DELIMITER //
CREATE PROCEDURE pro5(IN id INT,OUT NAME VARCHAR(32),OUT age INT)
BEGIN
	SELECT stu.`name`,stu.`age`
	INTO NAME,age
	FROM stu 
	WHERE stu.`id`=id;
END;
//
-- 调用
CALL pro5(1,@name2,@age);
SELECT @name2;
SELECT @age;
SELECT @name2,@age;

MySQL学习笔记(2)——存储过程与存储函数_第5张图片

(4)参数类型为inout类型:

-- 创建带inout模式参数的存储过程

-- 传入两个值a和b,最终a和b都翻倍并返回

DELIMITER //
CREATE PROCEDURE pro6(INOUT a INT,INOUT b INT)
BEGIN
	SET a=a*2;
	SET b=b*2;
END;

-- 调用
SET @m=10;
SET @n=20;
CALL pro6(@m,@n);
SELECT @m,@n;
//

MySQL学习笔记(2)——存储过程与存储函数_第6张图片

存储过程的其他操作

删除

格式:DROP PROCEDURE 存储过程名
注意: 一次只能删除一个存储过程

DELIMITER //
CREATE PROCEDURE pro7()
BEGIN
	SELECT * FROM stu;
END;
//

DROP PROCEDURE pro7;

显示存储过程

格式:SHOW CREATE PROCEDURE 存储过程名

SHOW CREATE PROCEDURE pro6;

在这里插入图片描述

注意:

以下操作不支持
不允许desc
DESC PROCEDURE pro7;
修改存储过程(不支持)

二、存储函数

1.存储过程与存储函数的区别:

存储过程可以有0个返回值,也可以有多个返回值,适合做批量插入,批量更新
函数:有且仅有1个返回值,适合做处理数据后返回一个结果

2.语法

2.1创建函数语法:

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

注意:
参数列表包含两个部分:参数名 参数类型

函数体:
一定要有return语句,否则将报错,建议放在函数体的最后

当函数体只有一句话,则begin end 可以省略

2.2调用语法:

SELECT 函数名(参数列表)

执行完语句,得到返回值

2.3查看函数

语法: SHOW CREATE FUNCTION 函数名称

SHOW CREATE FUNCTION fun2;

test

2.4删除函数

语法:DROP FUNCTION 函数名

DROP FUNCTION fun2;

2.5注意事项:

函数一般也不会去修改

3.实战

3.1无参数有返回

返回学生个数

DELIMITER //
CREATE FUNCTION fun1() RETURNS INT
BEGIN
	DECLARE result INT DEFAULT 0;-- 变量声明
	SELECT COUNT(*) INTO result FROM stu;
	RETURN result;
END;
//

SELECT fun1();

SELECT * FROM stu;

MySQL学习笔记(2)——存储过程与存储函数_第7张图片

3.2有参数有返回值

-- 根据学生名返回学生id
DELIMITER //
CREATE FUNCTION fun2(sname VARCHAR(32)) RETURNS INT
BEGIN
	SET @a=0; -- 定义一个用户变量
	SELECT id
	INTO @a
	FROM stu
	WHERE NAME = sname; 
	
	RETURN @a;
END;
//

SELECT fun2('jack');

SELECT * FROM stu;

MySQL学习笔记(2)——存储过程与存储函数_第8张图片

3.3 小练习

-- 创建函数:实现传入两个float,返回两者之和

DELIMITER //
CREATE FUNCTION num_sum(a FLOAT,b FLOAT) RETURNS FLOAT
BEGIN
	DECLARE result FLOAT DEFAULT 0;
	SET result = a + b;
	RETURN result;
END;
//

SELECT num_sum(1,2);

MySQL学习笔记(2)——存储过程与存储函数_第9张图片

结语

水平有限,难免有纰漏之处,望各位大佬敲打!
MySQL学习笔记(2)——存储过程与存储函数_第10张图片

你可能感兴趣的:(数据库,数据库,mysql,sql)