MySQL存储过程及语法详解

MySQL存储过程详解

什么是MySQL存储过程

MySQL存储过程是一种在MySQL数据库服务器上运行的子程序。它是一组SQL语句的集合,经过编译后被保存到数据库中,可通过调用来执行其中的语句,具有变量定义、流程控制、条件分支、循环等基本编程结构。

MySQL存储过程可以使数据库的应用程序更加简单有效,通过把复杂的业务逻辑封装在存储过程中实现,可最大限度地提高性能,减少数据传输次数,降低整体IO开销。

存储过程语法详解

1.创建存储过程

DELIMITER $$

CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
SQL语句;
END $$

DELIMITER ;

说明:

  • DELIMITER是为了防止SQL语句中使用";"造成语句无法正确提交的问题,在创建前需设置为"$$"或其他符号;
  • CREATE PROCEDURE是创建存储过程的关键字,后面跟着存储过程名称和参数列表,参数列表可以为空;
  • BEGIN——END之间是存储过程的执行语句,其中可以包含SELECT、INSERT、UPDATE、DELETE等SQL语句;
  • END后需要加上设置的分隔符,即"$$",表示语句结束。
  • 最后,需要将分隔符重置为";",防止下一条SQL语句被误认为是存储过程的一部分。

2.调用存储过程

CALL 存储过程名称([参数列表]);

说明:

CALL是调用存储过程的关键字,后面跟着存储过程名称和参数列表,参数列表可以为空。

3.条件分支和循环

MySQL存储过程有IF-ELSE、CASE、LOOP、REPEAT、WHILE、ITERATE和LEAVE等控制结构,可实现条件分支和循环等功能。

  • IF-ELSE和CASE:
DELIMITER $$

CREATE PROCEDURE `procedure_1`()
BEGIN
DECLARE score INT DEFAULT 90;
IF(score > 90) THEN
SELECT '优秀';
ELSEIF(score > 80) THEN
SELECT '良好';
ELSEIF(score > 70) THEN
SELECT '中等';
ELSE
SELECT '不及格';
END IF;
END $$

DELIMITER ;
DELIMITER $$

CREATE PROCEDURE `procedure_2`()
BEGIN
DECLARE score INT DEFAULT 80;
CASE
WHEN (score > 90) THEN SELECT '优秀';
WHEN (score > 80) THEN SELECT '良好';
WHEN (score > 70) THEN SELECT '中等';
ELSE SELECT '不及格';
END CASE;
END $$

DELIMITER ;
  • WHILE循环:
DELIMITER $$

CREATE PROCEDURE `procedure_3`()
BEGIN
DECLARE n INT DEFAULT 1;
WHILE n <= 10 DO
SELECT n;
SET n = n+1;
END WHILE;
END $$

DELIMITER ;
  • REPEAT...UNTIL循环:
DELIMITER $$

CREATE PROCEDURE `procedure_4`()
BEGIN
DECLARE n INT DEFAULT 1;
REPEAT
SELECT n;
SET n = n+1;
UNTIL n>10
END REPEAT;
END $$

DELIMITER ;

MySQL存储过程的优缺点

优点

1.提高性能:存储过程能够在数据库内部完成复杂的数据处理,降低了网络带宽占用和数据传输时间的开销,通过调用存储过程,减少了应用程序与数据库之间的交互次数,从而提升系统性能。

2.代码封装:将常用的SQL操作进行封装,使调用方便,提高程序代码的可维护性和可重用性,降低了代码的复杂度。

3.安全性:通过授权机制,从而使得存储过程能够满足更好的安全性要求,避免了SQL注入等各种攻击。

缺点

1.难以调试:存储过程编写需要使用特殊的存储过程语言,不能直接在代码中调试,需要在数据库中调用执行,较为麻烦。

2.可读性差:存储过程的编写使用特殊语法,因此可读性比较差,难以在代码中直接观察和排除错误。

3.部署麻烦:需要单独编写存储过程并在数据库中进行创建和调用,部署麻烦。

总结

MySQL存储过程是一种运行在MySQL数据库服务器上的子程序,是一组SQL语句的集合,可以实现流程控制、条件分支、循环等基本编程结构。尽管存储过程存在负面影响,但好处依然明显,像APM、ETL等核心领域均是存储过程的业务场景,因此,了解MySQL存储过程能力将对我们理解业务更为深刻的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL存储过程及语法详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • go语言 xorm框架 postgresql 的用法及详细注解

    下面我将详细讲解如何使用 Go 语言的 XORM 框架对 PostgreSQL 进行操作。 什么是 XORM 框架 XORM 是一个 Go 语言编写的 ORM 框架,它支持多种数据库,包括 MySQL、PostgreSQL 等。XORM 框架的初衷是提供一种简单易用且高效的方式来操作数据库,同时具备很高的可扩展性。它支持链式操作和 SQL 构建器,为开发者提…

    database 2023年5月18日
    00
  • SQL PLUS基本命令的使用方法示例

    SQL PLUS 是Oracle数据库中默认的交互式命令行界面,用于执行SQL语句和管理Oracle数据库。在本攻略中,我们将详细讲解SQL PLUS基本命令的使用方法示例。 1. 连接到Oracle数据库 首先,我们需要使用SQL PLUS连接到Oracle数据库。在运行SQL PLUS之前,请确保Oracle数据库已经启动。 使用以下命令连接到Oracl…

    database 2023年5月21日
    00
  • PHP使用PDO抽象层获取查询结果的方法示例

    下面是关于“PHP使用PDO抽象层获取查询结果的方法示例”的完整攻略,包括两条示例说明。 PDO抽象层介绍 PDO(PHP Data Objects)是一种PHP操作数据库的抽象层,使得PHP程序能够标准化地访问多种关系型数据库(如MySQL、SQLite、Oracle等),并提供了一组统一的API,方便程序员进行数据库操作。 PDO抽象层提供的主要类有: …

    database 2023年5月21日
    00
  • mysql中操作表常用的sql总结

    下面是关于“mysql中操作表常用的SQL总结”的完整攻略: MySQL中操作表常用的SQL总结 1. 创建表 MySQL中创建表的语法为: CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, …… ); 其中,table_name 表的名称,…

    database 2023年5月22日
    00
  • Java类加载器与双亲委派机制和线程上下文类加载器专项解读分析

    Java类加载器与双亲委派机制 Java中的类加载器用于将class文件加载到JVM中。Java中主要有三种类加载器:bootstrap class loader(启动类加载器)、extension class loader(扩展类加载器)和system class loader(系统类加载器)。其中扩展类加载器和系统类加载器统称为应用程序类加载器。 双亲委…

    database 2023年5月21日
    00
  • 一次MySQL慢查询导致的故障

    一次MySQL慢查询导致的故障攻略 1.什么是慢查询 慢查询是指数据库查询执行时间过长,超过一定时间阈值的查询。阈值可以根据实际需要设定,一般是几十毫秒到几秒不等。 2.为什么会导致故障 慢查询会影响数据库性能,当有大量慢查询出现时,会导致数据库负载升高,导致系统崩溃,服务不可用等情况。 3.如何监控慢查询 MySQL提供了slow query日志功能,可以…

    database 2023年5月21日
    00
  • Redis-Scan命令

                                                                                Scan命令 Scan命令:从海量的 key 中找出满足特定前缀的 key 列表 查询key为某一类型的数据可能有很多方法,例如可以通过keys*或者是keys codehole*,查询key前缀为codeh…

    Redis 2023年4月11日
    00
  • MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)出错的解决

    首先,MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)是比较常见的一种方式,但是在实际应用中,如果不注意一些细节,就容易出现错误。 问题现象:当使用如下代码时,查询结果为空: <select id="findByNameLike" parameterType="java.lang.String&qu…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部