史上最简单MySQL教程详解(进阶篇)之存储过程(一)

  • 史上最简单MySQL教程详解(进阶篇)之存储过程(一)

    • 什么是存储过程
    • 存储过程的作用
    • 如何使用存储过程
      • 创建存储过程

        • DELIMITER改变分隔符
        • 可使用的控制语句
        • 开始创建存储过程
      • 确认存储过程
      • 使用存储过程
      • 删除存储过程

什么是存储过程

SQL基本是一个命令实现一个处理的,是不能编写处理流程的。虽然通过子查询、多表连接等方式能实现一些高级的功能,但是具有很大的局限性。对于SQL本身是很难实现针对不同条件进行不同的处理或者循环等功能。即使能够实现,也是十分复杂或者对于性能有极大的影响。存储过程(Stored Procedure)就应运而生,它可以由SQL语句和各种条件判断、循环控制等语句组成,简单的说:存储过程像相互之间有联系的SQL语句组成的“小程序”。因为SQL的执行是需要经历一个:解析->编译->执行的过程的。存储过程是提前经过解析和编译存储在数据库中的,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

存储过程的作用

  • 提高执行性能:

    因为存储过程是提前创建并保存在数据库中的,当执行命令时,就能免去解析和编译的过程,能减轻数据库的负担,提高执行性能。

  • 可减轻网络负担:

    因为存储过程的执行,只需要客户端传递对应的参数即可,并不需要多次传递SQL命令本身,可以大大的减轻网络负担,减少彼此之间的通信量,整体提高数据库性能。

  • 提高数据库的安全性:

    存储过程禁止了对表本身的访问,只赋予用户对相关存储过程的访问权限。同时存储过程将数据处理部分“黑匣子化”后,程序本身的可读性和简洁性都会有所增加。用户不需要考虑存储过程的内部实现,只需要知道应该调用哪个存储过程即可。

如何使用存储过程

创建存储过程

创建存储过程使用的是【CREATE】语句,具体语法如下:

CREATE PROCEDURE 存储过程名(参数1的种类 参数名1 参数1的数据类型,参数2的种类 参数名2 参数2的数据类型
)
BEGIN 数据处理过程
END

上面提到的参数种类,主要分为下面三种类型:

参数种类 说明
IN 输入参数(可省略)
OUT 输出参数
INOUT 既是输出参数,也是输入参数

对于参数的数据类型,可参考这篇博文: 史上最简单MySQL教程详解(基础篇)之常用表操作和表参数介绍

在创建存储过程之前呢,还有下面几个要点需要掌握。

DELIMITER改变分隔符

【DELIMITER】是MySQL用来改变监视器中分离符的命令。默认的分隔符是【;】,但是,存储过程本身就是命令的集合,所以一定还会含有其他的分隔符。那么它们彼此之间冲突和混淆,所以在创建存储过程之前,我们需要将默认符换成一个完全无关的符号,只要不与其他关键字发生歧义即可,通常使用的是【//】。在完成创建之后,我们再将其回复即可。但需要提醒的是:分隔符的改变只会在启动期间有效,重新启动后,会自动恢复到默认状态。

可使用的控制语句

  1. 简单分支

    IF 条件表达式1
    条件表达式1为TRUE时执行的命令
    [ELSEIF 条件表达式N条件表达式N为TRUE时执行的命令
    ]
    [ELSE全部为False时执行的命令
    ]
    END IF
  2. 多重分支

    CASE 表达式1
    WHEN 值1 THEN 表达式1 = 值1时执行的命令
    ...
    WHEN 值N THEN 表达式1 = 值N时执行的命令
    [ELSE 上述所有值以外执行的命令]
    END CASE
  3. 循环控制(后置判断)

    REPEAT
    直至条件表达式为True时执行的命令
    UNTIL
    条件表达式
    END REPEAT
  4. 循环控制(前置判断)

    WHILE 条件表达式 DO
    系列命令
    END WHILE

开始创建存储过程

mysql> DELIMITER //-> CREATE PROCEDURE sp_student (IN p_name VARCHAR(20))-> BEGIN->  IF p_name IS NULL OR p_name = "" THEN ->      SELECT * FROM student ;->  ELSE ->      SELECT * FROM student WHERE studentName LIKE p_name;->  END IF ;-> END -> //
Query OK, 0 rows affected
mysql> DELIMITER ;

这样我们就创建了一个【sp_student】的存储过程。如果我们传入参数【p_name】,那么他就会进行模糊查询,否则就无条件查询。

确认存储过程

我们确认存储过程使用的是【SHOW】语句,具体语法如下:

SHOW PROCEDURE STATUS \G

例如:

mysql> SHOW PROCEDURE STATUS \G
*************************** 27. row ***************************Db: test1Name: sp_studentType: PROCEDUREDefiner: root@localhostModified: 2018-09-13 12:03:13Created: 2018-09-13 12:03:13Security_type: DEFINERComment:
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_unicode_ci
27 rows in set (0.00 sec)

结果集参数解释:

参数 说明
Db 所属数据库名
Name 存储过程名
Type 种类(PROCEDURE:存储过程/FUNCTION:函数)
Definer 创建者
Modified 最终更新时间
Created 创建时间
Security_type 安全种类(DEFINER:存储过程权限与创建用户权限一致)
Comment 备注
character_set_client 从客户端发送过来查询的字符编码
collation_connection 当前连接中使用的校对顺序
Database Collation 数据库的校对顺序

除此之外,还能使用下面的语句确认:

SHOW CREATE PROCEDURE 存储过程名\G

例如:

mysql> SHOW CREATE PROCEDURE sp_student\G
*************************** 1. row ***************************
Procedure: sp_student
sql_mode: STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USERCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_student`(IN p_name VARCHAR(20))
BEGINIF p_name IS NULL OR p_name = "" THENSELECT * FROM student ;ELSESELECT * FROM studnet WHERE studentName LIKE p_name;END IF ;END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_unicode_ci
1 row in set (0.00 sec)

这个会返回一些安全的设置信息,并且名称都会被单引号(‘ ’)括起来。

使用存储过程

使用存储过程,使用的是【CALL】命令,具体语法如下:

CALL 存储过程名(参数1,...);

例如:

mysql> CALL sp_student('路人%');    //提交了参数
+-----------+-------------+--------------+----------------+
| studentId | studentName | studentPhone | studentAddress |
+-----------+-------------+--------------+----------------+
| 4         | 路人甲      | 132          | 广州           |
| 5         | 路人乙      | 118          | 深圳           |
+-----------+-------------+--------------+----------------+
2 rows in setQuery OK, 0 rows affectedmysql> CALL sp_student('');    //未提交参数
+-----------+-------------+--------------+----------------+
| studentId | studentName | studentPhone | studentAddress |
+-----------+-------------+--------------+----------------+
| 1         | 张三        | 140          | 重庆           |
| 2         | 李四        | 137          | 北京           |
| 3         | 王五        | 135          | 上海           |
| 4         | 路人甲      | 132          | 广州           |
| 5         | 路人乙      | 118          | 深圳           |
+-----------+-------------+--------------+----------------+
5 rows in set
Query OK, 0 rows affected

删除存储过程

删除已经创建的存储过程使用【DROP】语句,具体语法如下:

DROP PROCEDURE 存储过程名;

例如:

mysql> DROP PROCEDURE sp_student;
Query OK, 0 rows affected (0.00 sec)

参考文献:

MySQL存储过程详解

《MySQL高效编程》

别忘了关注博主的个人公众号,有更多精彩内容、资源分享~

转载于:https://www.cnblogs.com/newtol/p/10159087.html

史上最简单MySQL教程详解(进阶篇)之存储过程(一)相关推荐

  1. 史上最简单MySQL教程详解(进阶篇)之存储引擎介绍及默认引擎设置

    什么是存储引擎? MySQL存储引擎种类 MyISAM 引擎 InnoDB引擎 存储引擎操作 查看存储引擎 存储引擎的变更 修改默认引擎 什么是存储引擎? 与其他数据库例如Oracle 和SQL Se ...

  2. 史上最简单MySQL教程详解(进阶篇)之索引及失效场合总结

    史上最简单MySQL教程详解(进阶篇)之索引及其失效场合总结 什么是索引及其作用 索引的种类 各存储引擎对于索引的支持 简单介绍索引的实现 索引的设置与分析 普通索引 唯一索引(Unique Inde ...

  3. 史上最简单MySQL教程详解(进阶篇)之视图

    史上最简单MySQL教程详解(进阶篇)之视图 为什么要用视图 视图的本质 视图的作用 如何使用视图 创建视图 修改视图 删除视图 查看视图 使用视图检索 变更视图数据 WITH CHECK OPTIO ...

  4. 史上最简单MySQL教程详解(基础篇)之SQL语句以及预留关键字介绍

    SQL简单介绍 数据操作语句 (Data Manipulation Language,DML) 数据定义语句 (Data Definition Language ,DDL) 数据控制语句 (Data ...

  5. 史上最简单MYSQL教程详解(基础篇)之初识MySQL数据库以及环境配置

    什么是数据库 数据库管理系统 数据库应用程序 数据库的种类 什么是MySQL MySQL数据库有哪些优势 SQL语句 常用术语 MySQL的安装 什么是数据库 数据库通俗的说法就是将数据信息集中起来统 ...

  6. mysql 前沿表设计_史上最简单MySQL教程详解(基础篇)之表的维护和改造

    表结构修改 在我们实际的开发的过程,随着开发的深入,会发现我们事先设计好的表可能已经不再适合,就会设计到对表的修改和改造.这里我就向大家介绍一下一些常用的方法和情况.这里我们使用的是之前在中就已经使用 ...

  7. mysql-win安装教程,WINDOWS下安装MYSQL教程详解

    1.下载安装包 2.配置环境变量 2.1 解压所下载的压缩包 2.2 环境变量 win 10 电脑 这么进去 3.生成data文件 在你解压的目录下,eg:F:\Program Files\mysql ...

  8. 史上最小白之BM25详解与实现

    史上最小白之BM25详解与实现 原理 BM25算法是一种计算句子与文档相关性的算法,它的原理十分简单:将输入的句子sentence进行分词,然后分别计算句子中每个词word与文档doc的相关度,然后进 ...

  9. 史上最小白之Transformer详解

    1.前言 博客分为上下两篇,您现在阅读的是下篇史上最小白之Transformer详解,在阅读该篇博客之前最好你能够先明白Encoder-Decoder,Attention机制,self-Attenti ...

最新文章

  1. unbalanced enable irq 问题的解决 以及共享的gpio中断引起的问题
  2. 【微信小程序】wx:if
  3. 工具条内控件背景色设置
  4. Linux gdb多进程、多线程调试
  5. 继承演练 动物 狗 哮天犬 c# 1613703354
  6. 257. 二叉树的所有路径
  7. jmeter压力测试linux,JMeter压力测试
  8. 【笑话】骂人的最高境界
  9. SQL中的ROW_NUMBER()和while循环对每一行执行操作
  10. python 传递任意数量的实参
  11. PHP中json对象转数组过程中去除字符串中的换行与数字方法
  12. css重复,css3重复渐变效果
  13. 第五章 组合逻辑电路设计
  14. Git、Github、Gitee、GitLab学习笔记
  15. C/C++ 小型餐馆订餐管理系统
  16. ScrollView滚动到底部3种方案(巧解现实产品一个需求)
  17. 经典电影配乐推荐【转载】
  18. 用户角色及权限管理设计实例(基于RBAC模型)
  19. 国外软件HFS 2.3x 远程命令执行漏洞 (本程序某些YY黑阔大牛抓鸡抓IP工具中使用到本软件)本站教程教习如何梨园远程命令执行。。中国寒龙...
  20. 诸神之眼——nmap入门教程

热门文章

  1. matlab打开界面模糊,如何在人机界面GUI的M文件中嵌入模糊FIS模块
  2. 前端基础HTML5CSS3动画
  3. struts、hibernate、spring、 mybatis、 spring boot 等面试题汇总
  4. android 两足机器人,基于Android的双足机器人语音控制系统研究
  5. html 字段大小,html td标签 限制字符长度
  6. python sdk怎么用_如何使用七牛Python SDK写一个同步脚本及使用教程
  7. horizon client 无法识别域_LY-W100摄像头视频定时拍照图像识别分析抄表读表无线远传水表数_水表吧...
  8. 判断奇数偶数和闰年(Python)
  9. python根据2点经纬度计算距离
  10. python学习笔记(一)基本数据类型