MySQL数据库操作学习(5)函数和储存过程

文章目录

一、简介

在 SQL 中,函数(Function)和存储过程(Stored Procedure)是两种可重复使用的数据库对象,但它们在设计和用途上有一些区别:

  1. 函数(Function)

    • 函数是一种接收参数并返回单个值的数据库对象。
    • 函数可以在 SELECT 语句中调用,用于计算和返回单个值。
    • 函数通常用于执行特定的计算或操作,并返回结果,比如数学运算、字符串操作等。
    • 函数可以被嵌套调用,也可以在其他查询中使用。
    • 函数不能包含数据操作语句(如 INSERT、UPDATE、DELETE)。insert updata delete
  2. 存储过程(Stored Procedure)

    • 存储过程是一组预编译的 SQL 语句集合,可接受参数并执行特定任务。
    • 存储过程可以包含各种 SQL 语句,包括数据操作语句(如 INSERT、UPDATE、DELETE)。
    • 存储过程可以执行一系列操作,如数据操作、流程控制、逻辑判断等。
    • 存储过程通常用于执行复杂的业务逻辑、数据操作和流程控制。
    • 存储过程可以返回多个结果集或输出参数。

总的来说,函数主要用于计算和返回单个值,而存储过程则更适合执行复杂的逻辑操作和数据处理。选择使用函数还是存储过程取决于具体的需求和场景。

二、函数

1.格式

sql 复制代码
delimiter 符号 # 自定义sql函数结束符号, 因为我们sql语句就是分号结束,一旦默认是分号结束,sql语句中运行到分号就会终止这个程序



create function  函数名 returns 返回类型
begin
	函数体
	return 返回值
	
end 符号

delimiter;

sql 复制代码
delimiter try #

create FUNCTION nb1()  returns INT
begin 

return (select s_id from student where class = 95032);

end try
delimiter;

# 查看return 函数结果

select nb1();

2.带参数的函数

sql 复制代码
delimiter 符号 # 自定义sql函数结束符号, 因为我们sql语句就是分号结束,一旦默认是分号结束,sql语句中运行到分号就会终止这个程序

create function  函数名(参数名 数据类型(n)) returns 返回类型
begin
	函数体
	return 返回值
	
end 符号

delimiter;

3.定义变量

复制代码
set @变量名 = 数值;

3.如何查询变量值

复制代码
select @变量名;
sql 复制代码
delimiter 小杨
create function nb2(str char(5)) returns INT

begin 
	return (select kt_id from course where k_name = str);

end 小杨
delimiter ;


select nb2("小杨");

select nb2("操作系统");



set @name = '操作系统';
select @name;
select nb2(@name);

三、储存过程

1.格式

sql 复制代码
delimiter 符号

create procedure 储存过程名称()
begin

​	储存过程(查询语句的集合)
​	
end 符号
delimiter ;

sql 复制代码
delimiter $$

CREATE procedure np1()
BEGIN
	select * from course;
	select * from student;

end $$
delimiter;

2.参数

sql 复制代码
delimiter 符号

create procedure 储存过程名称([in/out] 参数名 参数类型)
begin

​	储存过程(查询语句的集合)
​	
end 符号
delimiter ;

3.in的接入参数

sql 复制代码
delimiter !
create procedure np2(in number int)
begin 

​	select * from course where kt_id = number;
​	select * from teacher where t_id = number;

end !
delimiter;

call np2(825);
set @number = 825;
call np2(@number);

----

4.out的接入参数

而且out只能用形参传入,不能实参传入

sql 复制代码
delimiter !
create procedure np3(out number int)
begin 

​	select number;
​	set number = 32;
​	select number;

end !
delimiter;

call np3(825);
set @number = 825;
call np3(@number);

5.in和out区别

在存储过程中,INOUT 是用来定义参数的关键字,它们在存储过程中的作用有所不同:

  1. IN 参数

    • IN 参数用于向存储过程传递数值,字符串或其他数据类型的值。
    • IN 参数是存储过程的输入参数,即在调用存储过程时传递给存储过程的值。
    • 存储过程内部可以使用 IN 参数的值,但不能对其进行修改
    • IN 参数默认是只读的 ,存储过程执行完后,参数的值不会发生变化。
  2. OUT 参数

    • OUT 参数用于从存储过程中获取返回值或输出参数。
    • OUT 参数是存储过程的输出参数,即存储过程执行完后会将结果赋值给 OUT 参数。
    • 存储过程内部可以修改 OUT 参数的值,这个修改后的值会在存储过程执行完后返回给调用者。
    • OUT 参数可以用来返回存储过程执行的结果、状态信息或其他输出值。

举例说明:

sql 复制代码
CREATE PROCEDURE GetEmployeeInfo(IN emp_id INT, OUT emp_name VARCHAR(50))
BEGIN
    SELECT name INTO emp_name FROM employees WHERE id = emp_id;
END;

在上面的存储过程中,emp_id 是一个 IN 参数,用于传递员工的 ID 值;emp_name 是一个 OUT 参数,用于存储员工的姓名,这个姓名会在存储过程执行完后返回给调用者。

总的来说,IN 参数用于传递输入值给存储过程,而 OUT 参数用于从存储过程中获取返回值。

四、应用场景

函数和存储过程在 SQL 中有各自的使用场景,下面列举了它们常见的应用场景:

函数的使用场景

  1. 计算字段值:函数可以用于计算和返回特定字段的值,比如计算两个数的和、字符串的长度等。
  2. 数据转换:函数可以用于数据转换,比如日期格式转换、字符串格式化等。
  3. 约束条件:函数可以用于定义约束条件,确保数据符合特定规则。
  4. 查询优化:函数可以用于优化查询,减少重复计算或简化复杂查询。
  5. 数据加密:函数可以用于数据加密和解密操作。

存储过程的使用场景

  1. 复杂业务逻辑:存储过程适合处理复杂的业务逻辑,如订单处理流程、报表生成等。
  2. 数据操作:存储过程可以包含数据操作语句,用于管理和操作数据库中的数据。
  3. 事务管理:存储过程可以用于事务管理,确保一系列操作要么全部成功,要么全部失败。
  4. 权限控制:存储过程可以用于实现权限控制,限制用户对数据库的访问和操作。
  5. 性能优化:存储过程可以用于优化性能,减少网络通信开销和减少重复代码。

总的来说,函数适合简单的计算和数据转换操作,而存储过程适合处理复杂的业务逻辑和数据操作。在实际应用中,根据具体需求和场景选择合适的对象来实现相应的功能。

相关推荐
m0_7382065416 分钟前
嵌入式学习的第二十二天-数据结构-栈+队列
数据结构·学习
伤不起bb1 小时前
MySQL 高可用
linux·运维·数据库·mysql·安全·高可用
向上的车轮6 小时前
MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
笔记·学习·matlab
Yushan Bai6 小时前
ORACLE RAC环境REDO日志量突然增加的分析
数据库·oracle
躺着听Jay6 小时前
Oracle-相关笔记
数据库·笔记·oracle
瀚高PG实验室6 小时前
连接指定数据库时提示not currently accepting connections
运维·数据库
前端小崔7 小时前
从零开始学习three.js(18):一文详解three.js中的着色器Shader
前端·javascript·学习·3d·webgl·数据可视化·着色器
运维成长记7 小时前
mysql数据库-中间件MyCat
数据库·mysql·中间件
龙湾开发7 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(二)法线贴图
c++·笔记·学习·图形渲染·贴图
尘客.8 小时前
DataX从Mysql导数据到Hive分区表案例
数据库·hive·mysql