MySQL(自定义函数)

时间:2025-04-17 21:46:30

自定义函数

        概念:是一组预编译的SQL语句集合,它们被存储在数据库中并可重复使用。函数接受输入参数,执行特定操作,并且必须返回一个单一值。

        基本特点:

                封装性:将多个SQL操作封装为一个单元

                重用性:能在多个SQL语句中重复调用

                简化操作:使复杂的操作变得简单

                返回单一值:必须且只能返回一个值

                可在sql表达式中使用:可以直接在SELECT语句中使用

        基本结构

delimiter $$

create function 名称(参数 类型) 

returns return_datatype
begin
    DECLARE variable_name datatype [DEFAULT value];        -- 声明变量

   --SQL语句         -- 函数体
return value;        -- 返回值
end $$
delimiter ;

创建一个存储函数时,MySQL会要求你明确声明该函数的特性之一

  1. deterministic:函数对于相同的输入总是返回相同的结果。

  2. no sql:函数不包含任何 SQL 语句。

  3. reads sql data:函数只读取数据,但不修改数据。

  4. 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 ;