【MySql】MySql存储过程与函数

这篇具有很好参考价值的文章主要介绍了【MySql】MySql存储过程与函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

存储过程与函数

存储过程没有返回值,函数有返回值

存储过程

存储过程就是一组预先编译好的SQL语句的封装,需要执行时客户端向服务器发送调用请求,服务器就会将这一系列预先存储好的SQL语句全部执行。

简单举例:存储过程的创建

DELIMITER意味将$设置为结束标识,这样就可以在存储过程中使用分号进行分隔了,但注意要在末尾改回来

DELIMITER $
CREATE PROCEDURE select_all_data()
BEGIN
	SELECT * FROM employees;
END $

delimiter ;

调用存储过程:

CALL select_all_data();

求平均值的存储过程:

DELIMITER //
CREATE PROCEDURE avg_employee_salary()
BEGIN
	SELECT AVG(salary) AS avg_salary FROM employees;
END //
DELIMITER ;

CALL avg_employee_salary();

求最大值的存储过程:

DELIMITER $
CREATE PROCEDURE show_max_salary()
BEGIN
	SELECT MAX(salary)
	FROM employees;
END $
DELIMITER ;

CALL show_max_salary()

带IN、OUT、INOUT的存储过程

查看最低薪资并将其输出

# 查询工资最低并将其保存到ms变量中并输出
DELIMITER $
CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)
BEGIN
	SELECT MIN(salary) INTO ms
	FROM employees;
END $
DELIMITER ;

# 调用该函数
CALL show_min_salary(@temp);

# 调用变量
SELECT @temp;

查询某个员工的薪资

# 查询某个员工的薪资(使用IN作为形参传入值)
DELIMITER $
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
BEGIN
	SELECT salary FROM employees WHERE last_name = empname;
END $
DELIMITER ;

# 调用
CALL show_someone_salary('Abel');

# 或者这样调用
SET @empname := 'Abel';
CALL show_someone_salary(@empname);

查询某个员工的薪资,传入员工名称,传出员工薪资

# 查询某个员工的薪资,传入员工名称,传出员工薪资
DELIMITER //
CREATE PROCEDURE show_someone_salary2(IN empname Varchar(20), OUT empsalary DECIMAL(10, 2))
BEGIN
	SELECT salary INTO empsalary
	FROM employees
	WHERE last_name = empname;
END //
DELIMITER ;

# 调用
SET @empname := 'Abel';
CALL show_someone_salary2(@empname, @empsalary);

SELECT @empsalary;

选中员工的领导,并将传入的形参赋值为领导的名称:

# 选中员工的领导,并将传入的形参赋值为领导的名称:
DELIMITER $
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(20))
BEGIN
	SELECT last_name INTO empname
	FROM employees
	WHERE employee_id = (
		SELECT manager_id
		FROM employees
		WHERE last_name = empname
	);

END $
DELIMITER ;

# 调用
SET @empname := 'Abel';
CALL show_mgr_name(@empname);

SELECT @empname;

注意:在存储过程中进行的数据操作,一旦操作逻辑较为复杂时,难以进行排错

存储函数

存储函数就是指用户自定义的函数,这种函数必定有返回值。

创建一个存储函数用来返回Abel的邮箱

# 暂时改变分隔符
DELIMITER //
# 创建函数
CREATE FUNCTION email_by_name()
# 设置函数的返回值类型
RETURNS VARCHAR(25)
# 函数的一些限制,CONTAINS SQL意味着包含SQL语句,READS SQL DATA代表这是一条读数据,默认情况下这个限制是必须添加的
	DETERMINISTIC
	CONTAINS SQL
	READS SQL DATA
# 真正的函数体
BEGIN
	RETURN (SELECT email FROM employees WHERE last_name = 'Abel');
END //
# 将分隔符修改回分号
DELIMITER ;

# 调用函数
SELECT email_by_name();

创建一个存储函数,传入emp_id并查询其email并返回

注意如果不添加函数特征就必须设置全局属性log_bin_trust_function_creators属性为1

# 保证函数的创建必定成功,不需要添加函数的特征(DETERMINISTIC)
SET GLOBAL log_bin_trust_function_creators = 1;

DELIMITER //
CREATE FUNCTION email_by_id(emp_id INT)
RETURNS VARCHAR(25)
BEGIN
	RETURN (SELECT email FROM employees WHERE employee_id = emp_id);
END //
DELIMITER ;

# 调用
SELECT email_by_id(100);

# 使用变量进行调用
SET @temp1 := 100;
SELECT email_by_id(@temp1);

传入部门id并返回部门的人数

# 创建
DELIMITER //
CREATE FUNCTION count_by_id(dep_id INT)
RETURNS INT
BEGIN
	RETURN (
		SELECT COUNT(*)
		FROM employees
		WHERE department_id = dep_id
	);
END //
DELIMITER ;

# 调用
SELECT count_by_id(100);

存储过程和存储函数的简单对比

存储过程更倾向于将查询所得到的结果赋值给某个参数,其更适用于更新修改的操作中,其可以有多个赋值操作

存储函数则会将结果作为返回值,其可以更加灵活的运用在各种SQL语句中,其返回值只能为一个,一般用于只有一个结果的查询操作

存储过程与存储函数的查看、修改、删除

存储过程、函数的查看

注意以下信息都可以在控制台界面进行查看,在语句最后直接加’/G’进行查看

# 存储过程的查看创建信息
SHOW CREATE PROCEDURE avg_employee_salary;

# 存储函数的查看创建信息
SHOW CREATE FUNCTION count_by_id;

# 查看其状态信息
SHOW PROCEDURE STATUS;

SHOW PROCEDURE STATUS LIKE 'avg_employee_salary';

SHOW FUNCTION STATUS LIKE 'count_by_id';


# 所有的存储过程与存储函数都会存储在information_schema.Routines中,对这个表进行查询也可以获取信息
SELECT *
FROM information_schema.Routines
WHERE ROUTINE_NAME = 'email_by_id'

存储过程、函数的修改与删除

注意存储过程与存储函数在创建好之后就不允许修改函数体,但我们可以对权限、注释等信息进行进一步修改文章来源地址https://www.toymoban.com/news/detail-706784.html

# 修改存储过程或存储函数的相关信息
ALTER PROCEDURE show_max_salary
SQL SECURITY INVOKER
COMMENT '最高工资'

# 删除
DROP FUNCTION IF EXISTS count_by_id;

对于存储过程和存储函数的使用争议

其优点

  1. 可以提高SQL的执行效率:存储过程可以一次编译、多次使用,减少了SQL语句的编译次数,可以提高数据库调用的效率。
  2. 减少开发的工作量:将SQL语句封装为存储过程或函数,可以重复调用方法,不需要编写重复代码,可以减少开发的工作量。
  3. 安全性较强:在存储过程和存储函数中可以设置对用户的使用权限,以提高安全性。
  4. 可以减少网络传输量:具体代码被封装到存储过程或存储函数中,每次只需要进行调用,有效减少网络传输量。
  5. 良好的封装性:再进行较为复杂的数据库操作时,原本一条条的SQL可能会连接多次数据库,封装之后就只需要连接一次。

其缺点

  1. 可移植性差:存储过程或存储函数不可以跨数据库移植,在发生数据库变化的情况时需要重新编写。
  2. 调试困难(主要):只有少数的数据库支持存储过程的调试,在开发和维护的阶段都会有极大的不便。
  3. 版本管理困难:在一些其他情况发生时(例如数据库索引发生变化),会导致存储过程或存储函数失效,此时的版本问题就会十分麻烦
  4. 不适合高并发场景:在分库分表的场景下,存储过程就会十分难以维护。

到了这里,关于【MySql】MySql存储过程与函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql数据库实验报告--实验五 存储过程和触发器

    在这个系列会更新一些最近老师要求写的实验报告~ 大家尽量对着我的文章做一个参考,不要盲目的cv,毕竟这个对于我们以后的工作学习还是十分重要的。 从这个实验开始,就不在cmd命令行里面进行mysql数据库的操作,因为代码长度和代码的复杂性,需使用 MySQL Workbench: 双

    2024年02月09日
    浏览(39)
  • MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)

    目录 系统变量  1.查看系统变量  2.设置系统变量 演示示例 用户定义变量 1.赋值  2.使用 演示示例 局部变量 声明  赋值 演示示例 变量 在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。 系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全

    2024年02月05日
    浏览(38)
  • 使用MySQL存储过程提高数据库效率和可维护性

    MySQL 存储过程是一种强大的数据库功能,它允许你在数据库中存储和执行一组SQL语句,类似于编程中的函数。存储过程可以大幅提高数据库的性能、安全性和可维护性。本文将详细介绍MySQL存储过程的使用。 MySQL存储过程是一组预编译的SQL语句,它们以一个名称存储在数据库

    2024年02月08日
    浏览(35)
  • MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)

    目录 介绍 特点 基本语法 创建 调用 查看 删除  示例  存储过程是 事先经过编译 并 存储在数据库 中的一段 SQL 语句的 集合 ,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想

    2024年02月06日
    浏览(46)
  • 【Mysql】X-DOC:Mysql数据库大量数据查询加速(定时JOB和存储过程应用案例)

    在某中台系统中,设计了大量的基础数据(维度数据、维度映射关系等)来支撑业务功能,业务表中存在大量的维度外键关联字段,其优点是可以实现前端的选择录入,数据校验,确保录入数据的准确性;缺点是在做业务报表时,需要做大量的维度关联(join)操作。 受限于

    2024年02月12日
    浏览(32)
  • 【MySQL】探索MySQL存储过程的魔力,初学者的数据库编程秘笈(内含实战SQL脚本)

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:重温MySQL MySQL存储过程作为一种服务器端的 数据库编程方式 ,提供了高效、可重用的方法来执行相对复杂的数据库操

    2024年02月15日
    浏览(47)
  • SQL Server判断数据库、表、列、视图、存储过程、函数是否存在

    在写一些业务逻辑相对复杂点的存储过程的时候,经常会用到临时表或者数据表作为临时结果的保存。但每次在作表是否存在的判断时,往往想不起完整的SQL写法。因此,记录一些常用的数据库对象是否存在的判断方法,可以达到快速查找的目的。正是:好记性不如烂笔头。

    2024年02月02日
    浏览(49)
  • MySQL 数据库存储引擎

    目录 一、存储引擎简介 二、MyISAM存储引擎 1、MylSAM介绍 2、MyISAM表支持3种不同的存储格式 3、MylSAM的特点 4、MyISAM使用的生产场景 三、InnoDB存储引擎 1、InnoDB介绍 2、InnoDB的特点 3、InnoDB适用生产场景 4、MyISAM和InnoDB的区别 四、查看和修改存储引擎 1、查看系统支持的存储引擎

    2023年04月25日
    浏览(38)
  • MySQL数据库之存储引擎

    MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。 存储引擎是

    2024年02月03日
    浏览(38)
  • 【MySQL数据库 | 第十六篇】存储引擎

    目录  前言:  MySQL体系结构图: 存储引擎简介: 1. InnoDB存储引擎: 2. MyISAM存储引擎: 3. MEMORY存储引擎: 4. NDB Cluster存储引擎: 5. ARCHIVE存储引擎: 存储引擎语法: ACID与行级锁:  总结: 经过前面15篇的学习,我们已经学完了SQL的基本语法内容,大致掌握了数据库的操作

    2024年02月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包