自定义函数
概念:是一组预编译的SQL语句集合,它们被存储在数据库中并可重复使用。函数接受输入参数,执行特定操作,并且必须返回一个单一值。
基本特点:
封装性:将多个SQL操作封装为一个单元
重用性:能在多个SQL语句中重复调用
简化操作:使复杂的操作变得简单
返回单一值:必须且只能返回一个值
可在sql表达式中使用:可以直接在SELECT语句中使用
基本结构
delimiter $$
create function 名称(参数 类型)
returns return_datatype
begin
DECLARE variable_name datatype [DEFAULT value]; -- 声明变量--SQL语句 -- 函数体
return value; -- 返回值
end $$
delimiter ;
创建一个存储函数时,MySQL会要求你明确声明该函数的特性之一
deterministic
:函数对于相同的输入总是返回相同的结果。
no sql
:函数不包含任何 SQL 语句。
reads sql data
:函数只读取数据,但不修改数据。
modifies sql data
:函数会修改数据。
函数与存储过程的区别
函数和存储过程都是MySQL中的程序化对象,但它们在用途、语法和行为上有明显区别。
特性 | 函数 | 存储过程 |
返回值 | 必须返回一个单一值 | 可以返回多个值,也可以不返回值 |
调用方式 | 可以在SQL语句中直接调用 | 使用call语句单独调用 |
使用场景 | 计算和数据转换 | 执行复杂的业务逻辑和事务 |
参数类型 | 只支持输入参数(IN) | 支持输入(IN)、输出(OUT)和输入输出(INOUT)参数 |
事务操作 | 通常不在函数中进行事务操作 | 经常包含事务处理 |
数据修改 | 一般不建议在函数中修改数据 | 可以执行数据修改操作 |
实例
MySQL:
-- 班级表
CREATE TABLE class (
class_id INT PRIMARY KEY,
class_name VARCHAR(20)
);
INSERT INTO class VALUES
(1, '高一(1)班'),
(2, '高一(2)班'),
(3, '高一(3)班');-- 学生表
CREATE TABLE student (
stu_id INT PRIMARY KEY,
stu_name VARCHAR(20),
gender CHAR(1),
class_id INT
);
INSERT INTO student VALUES
(101, '陈小明', '男', 1),
(102, '李芳芳', '女', 1),
(103, '张强', '男', 2),
(104, '王丽丽', '女', 3),
(105, '赵刚', '男', 2);-- 成绩表
CREATE TABLE score (
exam_id INT PRIMARY KEY,
stu_id INT,
subject VARCHAR(10),
score DECIMAL(5,2),
exam_date DATE
);
INSERT INTO score VALUES
(1, 101, '数学', 85.5, '2023-10-01'),
(2, 101, '英语', 78.0, '2023-10-02'),
(3, 102, '数学', 92.0, '2023-10-01'),
(4, 103, '物理', 65.5, '2023-10-03'),
(5, 104, '英语', 88.5, '2023-10-02'),
(6, 105, '数学', 55.0, '2023-10-01'),
(7, 105, '英语', 47.0, '2023-10-02');
判断成绩是否及格
DELIMITER $$
CREATE FUNCTION is_pass(score DECIMAL(5, 2))
RETURNS VARCHAR(10)
deterministic
BEGIN
IF score >= 60 THEN
RETURN '及格';
ELSE
RETURN '不及格';
END IF;
END $$
DELIMITER ;