MySQL创建自定义函数教程

1.语法

create function 函数名([参数列表]) returns 数据类型
begin
 sql语句;
 return;
end;

2.示例

2.1 举例

创建一个现实时间的函数:


create function show_time() 
returns varchar(30)
return date_format(now(),%Y年%m月%d日 %H时%i分%s秒’);

创建一个通过id获取姓名的函数:

DELIMITER //
CREATE FUNCTION get_number_by_id(id INT)
RETURNS VARCHAR(300)
BEGIN
RETURN (SELECT CONCAT('name: ', name, '--', 'number: ', number)
FROM users_info WHERE uid = id);
END//
DELIMITER ;

其中DELIMITER 先定义结束符为 // , 然后又将结束符改为mysql默认的分号结束符。

了解delimiter 关键字请点击:
MySQL中 delimiter 关键字详解

2.2 报错

如果创建自定义函数时遇到下面这种报错:

Error Code : 1418 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

原因分析:
导致该错误的原因可能是一个安全设置方面的配置,查手册log_bin_trust_function_creators参数缺省0,是不允许function的同步的,一般我们在配置repliaction的时候,都忘记关注这个参数,这样在master更新funtion后,slave就会报告错误,然后slave stoped。
解决办法可以参考这里:
MySQL ERROR 1418 的解决方法

3.练习

3.1 练习数据库及表创建

MySQL版本:8.0.20

-- 如果已有该数据库,则删除
DROP DATABASE IF EXISTS StudentScore;

-- 创建数据库
CREATE DATABASE StudentScore CHARSET=UTF8;

-- 使用数据库
USE StudentScore;

-- 创建数据表
-- table 1: students

DROP TABLE IF EXISTS students;

CREATE TABLE students(
sid INT(20) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
sname VARCHAR(20),
sclass INT(10),
sgender VARCHAR(10),
smajor VARCHAR(20),
sbirthday DATE
);

-- table 2: teachers

DROP TABLE IF EXISTS teachers;

CREATE TABLE teachers(
tid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
tname VARCHAR(20),
tschool VARCHAR(20)
);

-- table 3: courses

DROP TABLE IF EXISTS courses;

CREATE TABLE courses(
cid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
cname VARCHAR(20),
tid INT(10) UNSIGNED NOT NULL,
FOREIGN KEY(tid) REFERENCES teachers(tid)
);

-- table 4: scores

DROP TABLE IF EXISTS scores;

CREATE TABLE scores(
sid INT(10) UNSIGNED NOT NULL,
cid INT(10) UNSIGNED NOT NULL,
score DECIMAL(5, 2),
FOREIGN KEY(sid) REFERENCES students(sid),
FOREIGN KEY(cid) REFERENCES courses(cid)
);

-- 插入数据
INSERT INTO students VALUES
(0, '赵雷', 1, '男', '计算机', '1990-01-01'),
(0, '钱电', 2, '男', '计算机', '1990-12-21'),
(0, '孙风', 3, '男', '计算机', '1990-12-20'),
(0, '李云', 1, '男', '计算机', '1990-12-06'),
(0, '周梅', 2, '女', '物理', '1991-12-01'),
(0, '吴兰', 3, '女', '物理', '1992-01-01'),
(0, '郑竹', 1, '女', '物理', '1989-01-01'),
(0, '张三', 2, '女', '物理', '2017-12-20'),
(0, '李四', 3, '女', '数学', '2017-12-25'),
(0, '李四', 1, '女', '数学', '2012-06-06'),
(0, '赵六', 2, '女', '数学', '2013-06-13'),
(0, '孙七', 3, '女', '数学', '2014-06-01');


INSERT INTO teachers VALUES
(0, '张若尘', '时空学院'),
(0, '孙悟空', '魔法学院'),
(0, '纪梵心', '本源学院'),
(0, '萧炎', '斗气学院'),
(0, '鲁班', '机械学院');


INSERT INTO courses VALUES
(0, '变形', 2),
(0, '时空穿梭', 1),
(0, '分解术', 3),
(0, '炼器', 5),
(0, '炼丹', 4),
(0, '飞行', 2);


INSERT INTO scores VALUES
(1, 1, 80),
(1, 2, 90),
(1, 3, 99),
(2, 1, 70),
(2, 2, 60),
(2, 3, 80),
(3, 1, 80),
(3, 2, 80),
(3, 3, 80),
(4, 1, 50),
(4, 2, 30),
(4, 3, 20),
(5, 1, 76),
(5, 2, 87),
(6, 1, 31),
(6, 3, 34),
(7, 2, 89),
(8, 1, 88),
(8, 2, 82),
(8, 4, 81),
(9, 6, 95),
(10, 5, 86);

3.2 创建自定义函数1

创建一个通过学号sid获取学生信息的函数

DROP FUNCTION IF EXISTS get_student_info_by_sid;

DELIMITER //
CREATE DEFINER = CURRENT_USER FUNCTION get_student_info_by_sid(id INT)
RETURNS VARCHAR(300)
DETERMINISTIC
BEGIN
RETURN (SELECT CONCAT('姓名: ', sname, ' , ', '性别: ', sgender, ' , ', '专业:', smajor)
FROM students WHERE sid = id);
END//
DELIMITER ;

-- 调用函数
SELECT get_student_info_by_sid(8);

调用函数结果:
在这里插入图片描述

3.3 自定义函数 2:要求函数体中包含其中一种流程控制语句

创建函数:要求输入学生学号sid、课程编号,显示学生成绩是否及格(即成绩>=60)

DROP FUNCTION IF EXISTS get_student_scores_by_id;

DELIMITER //
CREATE DEFINER = CURRENT_USER FUNCTION get_student_scores_by_id(sid INT, cid INT)
RETURNS VARCHAR(300)
DETERMINISTIC
BEGIN
	DECLARE score INT;
	SELECT sc.score INTO score
	FROM scores AS sc
	WHERE sc.sid = sid AND sc.cid = cid;
	IF score >= 60 THEN
		RETURN '及格';
	ELSEIF score > 0 AND score < 60 THEN
		RETURN '不及格';
	ELSE
		RETURN '找不到该学生或该学生没有选课!';
	END IF;
END//
DELIMITER ;

-- 调用函数
SELECT get_student_scores_by_sid(1, 2);

调用函数结果:
在这里插入图片描述
参考:
https://www.cnblogs.com/progor/p/8871480.html

猜你喜欢

转载自blog.csdn.net/Artificial_idiots/article/details/106754297