MySQL数据库 存储过程 & 存储函数

  • 前言
  • 一、什么是存储过程 & 存储函数
  • 二、存储过程的创建和调用
  • 三、存储函数的创建和调用

前言

本环境是基于 Centos 7.8 系统构建MySQL-5.7.14
具体构建,请参考 MySQL-5.7.14 环境构建


一、什么是存储过程 & 存储函数

存储过程 & 存储函数

存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合。
存储过程和函数的区别:

  • 函数必须有返回值,而存储过程没有。
  • 存储过程的参数可以是IN、OUT、INOUT类型,函数的参数只能是IN

优点

  • 存储过程只在创建时进行编译;而SQL语句每执行一次就编译一次,所以使用存储过程可以提高数据库执行速度。
  • 简化复杂操作,结合事务一起封装。
  • 复用性好
  • 安全性高,可指定存储过程的使用权。

注:1、并发量少的情况下,很少使用存储过程。
2、并发量高的情况下,为了提高效率,用存储过程比较多

二、存储过程的创建和调用

存储过程的参数包括IN、OUT、INOUT类型

无参数

# 准备student表
mysql> select * from student;
+--------------+-----------+---------+---------+-----------+--------------+
| stu_id       | stu_name  | stu_sex | stu_age | stu_major | stu_college  |
+--------------+-----------+---------+---------+-----------+--------------+
| 201804550101 | 郭奎      | 男      |      22 | 计科      | 信工学院     |
| 201804550102 | 吕宇航    | 男      |      18 | 计科      | 信工学院     |
| 201804550103 | 张豪辉    | 女      |      19 | 计科      | 信工学院     |
| 201804550107 | 丁志杰    | 男      |      17 | 金融学    | 金贸学院     |
| 201804550109 | 范伟      | 男      |      19 | 金融学    | 金贸学院     |
| 201804550116 | 张依婷    | 女      |      17 | 大数据    | 信工学院     |
| 201804550120 | 张维      | 男      |      19 | 计科      | 信工学院     |
| 201804550121 | 朱柳阳    | 女      |      20 | 计科      | 信工学院     |
| 201804550144 | 谭兵炎    | 男      |      20 | 大数据    | 信工学院     |
| 201804550153 | 杨志强    | 男      |      17 | 大数据    | 信工学院     |
+--------------+-----------+---------+---------+-----------+--------------+
10 rows in set (0.00 sec)# 针对student表创建存储过程
mysql> create procedure p1()-> begin->   select * from student;-> end$$
Query OK, 0 rows affected (0.05 sec)mysql> \d ;# 调用存储过程
mysql> call p1();
+--------------+-----------+---------+---------+-----------+--------------+
| stu_id       | stu_name  | stu_sex | stu_age | stu_major | stu_college  |
+--------------+-----------+---------+---------+-----------+--------------+
| 201804550101 | 郭奎      | 男      |      22 | 计科      | 信工学院     |
| 201804550102 | 吕宇航    | 男      |      18 | 计科      | 信工学院     |
| 201804550103 | 张豪辉    | 女      |      19 | 计科      | 信工学院     |
| 201804550107 | 丁志杰    | 男      |      17 | 金融学    | 金贸学院     |
| 201804550109 | 范伟      | 男      |      19 | 金融学    | 金贸学院     |
| 201804550116 | 张依婷    | 女      |      17 | 大数据    | 信工学院     |
| 201804550120 | 张维      | 男      |      19 | 计科      | 信工学院     |
| 201804550121 | 朱柳阳    | 女      |      20 | 计科      | 信工学院     |
| 201804550144 | 谭兵炎    | 男      |      20 | 大数据    | 信工学院     |
| 201804550153 | 杨志强    | 男      |      17 | 大数据    | 信工学院     |
+--------------+-----------+---------+---------+-----------+--------------+
10 rows in set (0.03 sec)Query OK, 0 rows affected (0.03 sec)# 查看存储过程的创建
mysql> show create procedure p1\G
*************************** 1. row ***************************Procedure: p1sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
beginselect * from student;
end
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)
# 创建tb1表
mysql> create table tb1-> (id int,-> name varchar(30)-> );
Query OK, 0 rows affected (0.06 sec)# 创建存储过程
mysql> \d $$
mysql> create procedure pro1_insert_tb1()-> begin-> declare i int default 1;-> while(i<=50000)do->   insert into tb1 values(i,md5(i));->   set i=i+1;-> end while;-> end $$
Query OK, 0 rows affected (0.06 sec)
mysql> \d ;# 查看存储过程
mysql> show create procedure pro1_insert_tb1\G
*************************** 1. row ***************************Procedure: pro1_insert_tb1sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `pro1_insert_tb1`()
begin
declare i int default 1;
while(i<=50000)doinsert into tb1 values(i,md5(i));set i=i+1;
end while;
end
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)# 调用存储过程
mysql> call pro1_insert_tb1();
Query OK, 1 row affected (10.10 sec)# 查看插入数据
mysql> select count(1) from tb1;
+----------+
| count(1) |
+----------+
|    50000 |
+----------+
1 row in set (0.01 sec)mysql> select * from tb1-> where id=10000 or id=20000 or id=30000;
+-------+----------------------------------+
| id    | name                             |
+-------+----------------------------------+
| 10000 | b7a782741f667201b54880c925faec4b |
| 20000 | d9798cdf31c02d86b8b81cc119d94836 |
| 30000 | 5ecc613150de01b7e6824594426f24f4 |
+-------+----------------------------------+
3 rows in set (0.01 sec)

IN 参数

# 清空表数据
mysql> delete from tb1;
Query OK, 50000 rows affected (0.34 sec)mysql> select * from tb1;
Empty set (0.00 sec)# 创建存储过程
mysql> \d $$
mysql> create procedure in_insert_tb1(in num int)-> begin->   declare i int default 1;->   while(i<=num)do->     insert into tb1 values(i,md5(i));->     set i=i+1;->   end while;-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> \d ;# 查看存储过程的创建
mysql> show create procedure in_insert_tb1\G
*************************** 1. row ***************************Procedure: in_insert_tb1sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `in_insert_tb1`(in num int)
begindeclare i int default 1;while(i<=num)doinsert into tb1 values(i,md5(i));set i=i+1;end while;
end
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)# 调用存储过程
mysql> call in_insert_tb1(80000);
Query OK, 1 row affected (15.42 sec)查看插入数据
mysql> select count(1) from tb1;
+----------+
| count(1) |
+----------+
|    80000 |
+----------+
1 row in set (0.01 sec)mysql> select * from tb1-> where id=3000 or id=6000 or id =80000;
+-------+----------------------------------+
| id    | name                             |
+-------+----------------------------------+
|  3000 | e93028bdc1aacdfb3687181f2031765d |
|  6000 | a8c6dd982010fce8701ce1aef8a2d40a |
| 80000 | 144fdd8be8005ab7206deaaedc515e71 |
+-------+----------------------------------+
3 rows in set (0.02 sec)

OUT 参数

mysql> \d $$
mysql> create procedure count_tb1(out count int)-> begin->   select count(1) into count from tb1;-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> \d ;# 查看创建过程
mysql> show create procedure count_tb1\G
*************************** 1. row ***************************Procedure: count_tb1sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `count_tb1`(out count int)
beginselect count(1) into count from tb1;
end
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)# 定义变量接受count值
mysql> select @v;
+------+
| @v   |
+------+
| NULL |
+------+
1 row in set (0.00 sec)# 调用存储过程
mysql> call count_tb1(@v);
Query OK, 1 row affected (0.02 sec)mysql> select @v;
+-------+
| @v    |
+-------+
| 80000 |
+-------+
1 row in set (0.00 sec)

IN & OUT

---student表创建存储过程(性别:男,年龄:19 的学生个数)
# student 查询
mysql> select count(1) from student where stu_sex='男' and stu_age=19;
+----------+
| count(1) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)# 创建存储过程
mysql> \d $$
mysql> create procedure count_num(in p1 enum('男','女'),in p2 tinyint(255) unsigned,out p3 int)-> begin ->   select count(1) into p3 from student where stu_sex=p1 and stu_age=p2;-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> \d ;# 查看存储过程的创建
mysql> show create procedure count_num\G
*************************** 1. row ***************************Procedure: count_numsql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `count_num`(in p1 enum('男','女'),in p2 tinyint(255) unsigned,out p3 int)
begin select count(1) into p3 from student where stu_sex=p1 and stu_age=p2;
end
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)# 调用存储过程,传入、接受参数
mysql> call count_num('男',19,@V);
Query OK, 1 row affected (0.00 sec)# 产看参数@V的值
mysql> select @V;
+------+
| @V   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

INOUT

mysql> \d $$
mysql> create procedure proce_param_inout(inout p1 int)-> begin->   if (p1 is not null) then->     set p1=p1+1;->   else->     select 100 into p1;->   end if;-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> \d ;mysql> select @M;
+------+
| @M   |
+------+
| NULL |
+------+
1 row in set (0.00 sec)mysql> call proce_param_inout(@M);
Query OK, 1 row affected (0.00 sec)mysql> select @M;
+------+
| @M   |
+------+
|  100 |
+------+
1 row in set (0.00 sec)mysql> call proce_param_inout(@M);
Query OK, 0 rows affected (0.00 sec)mysql> select @M;
+------+
| @M   |
+------+
|  101 |
+------+
1 row in set (0.00 sec)mysql> call proce_param_inout(@M);
Query OK, 0 rows affected (0.00 sec)mysql> select @M;
+------+
| @M   |
+------+
|  102 |
+------+
1 row in set (0.00 sec)

删除存储过程

mysql> drop procedure count_num;
Query OK, 0 rows affected (0.00 sec)mysql> drop procedure count_tb1;
Query OK, 0 rows affected (0.00 sec)mysql> drop procedure pro1_insert_tb1;
Query OK, 0 rows affected (0.00 sec)

三、存储函数的创建和调用

无参数有返回值

# 创建存储函数
--- 统计student表学生个数
mysql> \d $$
mysql> create function stu_num()-> returns int-> begin->   declare n int default 0;->   select count(1) into n from student;->   return n;-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> \d ;# 调用函数
mysql> select stu_num();
+-----------+
| stu_num() |
+-----------+
|        10 |
+-----------+
1 row in set (0.00 sec)

有参数、有返回值

---根据学生姓名、返回学生年龄
mysql> create function my_age(my_name varchar(50))-> returns int-> begin->   declare s_age int;->   select stu_age into s_age from student->   where stu_name=my_name;->   return s_age;-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> \d ;mysql> select my_age('范伟');
+------------------+
| my_age('范伟')   |
+------------------+
|               19 |
+------------------+
1 row in set (0.00 sec)mysql> select my_age('杨志强');
+---------------------+
| my_age('杨志强')    |
+---------------------+
|                  17 |
+---------------------+
1 row in set (0.00 sec)
---根据专业名称,返回该专业平均年龄
mysql> create function stu_avg_age(major char(9))-> returns int-> begin->   declare avg_age int;->   select avg(stu_age) into avg_age from student->   where stu_major=major;->    return avg_age;-> end $$
Query OK, 0 rows affected (0.00 sec)mysql> \d ;
mysql> select stu_avg_age('计科');
+-----------------------+
| stu_avg_age('计科')   |
+-----------------------+
|                    20 |
+-----------------------+
1 row in set (0.03 sec)mysql> select stu_avg_age('大数据');
+--------------------------+
| stu_avg_age('大数据')    |
+--------------------------+
|                       18 |
+--------------------------+
1 row in set (0.00 sec)mysql> select stu_avg_age('金融学');
+--------------------------+
| stu_avg_age('金融学')    |
+--------------------------+
|                       18 |
+--------------------------+
1 row in set (0.00 sec)

删除存储函数

mysql> drop function stu_avg_age;
Query OK, 0 rows affected (0.00 sec)mysql> drop function my_age;
Query OK, 0 rows affected (0.00 sec)mysql> drop function stu_num;
Query OK, 0 rows affected (0.00 sec)

MySQL 案例实战--MySQL数据库 存储过程 存储函数相关推荐

  1. MySQL 案例实战--MySQL 数据库 之 冷备份

    MySQL 数据库 之 冷备份 前言 一.数据库备份类型 二.数据库备份的内容 三. MySQL 数据库 之 冷备份 1.环境准备 2.备份要求 3.备份流程 前言 本环境是基于 Centos 7.8 ...

  2. MySQL 案例实战--MySQL 数据库 之 温备份 热备份

    MySQL 数据库 之 温备份 & 热备份 前言 一.完全备份方案 二.增量备份方案 三.GTID 备份 四.mydumper 备份 五.LVM 快照备份 六.xtrabackup 备份 1. ...

  3. MySQL 案例实战--MySQL 基于Mycat实现读写分离

    MySQL 基于Mycat实现读写分离 前言 一.什么是读写分离? 二.MySQL 读写分离解决方案 三.MySQL 基于Mycat实现读写分离 四.Mycat-web 管理部署 前言 本环境是基于 ...

  4. MySQL 案例实战--MySQL数据库 单表查询 一

    前言 本环境是基于 Centos 7.8 系统构建MySQL-5.7.14 具体构建,请参考 MySQL-5.7.14 环境构建 素材准备: DROP TABLE IF EXISTS `course` ...

  5. WebDay18 MySQL存储过程 存储函数 触发器 事务

    MySQL存储过程 存储函数 触发器 事务 一.MySQL存储过程和函数 1.存储过程和函数的概念 2.存储过程和函数的好处 3.存储过程和函数的区别 4.创建存储过程 5.调用存储过程 6.查看存储 ...

  6. Day463.视图存储过程存储函数 -mysql

    视图 1. 常见的数据库对象 对象 描述 表(TABLE) 表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录 数据字典 就是系统表,存放数据库相关信息的表.系统表的数据通常由数据库系 ...

  7. 视图存储过程存储函数

    文章目录 视图 常见数据库对象 视图概述 为什么使用视图? 视图的理解 创建视图 创建单表视图 创建多表联合视图 基于视图创建视图 查看视图 更新视图的数据 一般情况 不可更新的视图 修改.删除视图 ...

  8. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表.---查询语句创建表 create table emp as ...

  9. mysql 登录默认实例_【MySQL案例】mysql本机登录-S失灵_mysql

    [mysql案例]mysql本机登录-S失效 1.1.1. mysql本机登录mysql时,-S参数失效 [环境描述] mysql5.5.14 [问题描述] 配置了多实例 实例1 实例2 datadi ...

最新文章

  1. 加入新e时代建站网后,我可以做什么
  2. java并发编程与线程安全
  3. robotframework如何设计web页面的自动化---启动robotframework ride
  4. 如何在IE浏览器里面定位到关键字的位置(页面代码)和这个关键字位置模块的请求
  5. Opencv FFmpeg Ubuntu下编译问题
  6. MySQL Create Table创建表
  7. maven更新总结与tomcat发布方法总结
  8. UVa 674 - Coin Change
  9. 自定义表单提交后返回上一页修改
  10. 实施工程师是干嘛的_CTO大怒:300万建设数据中台,啥也没看见,我要它干嘛?...
  11. cafebabe.cc/nazo解答笔记
  12. cv2.VideoCapture.get()用法
  13. 我的Python心路历程 第十期 (10.5 股票实战之数据可视化曲线)
  14. 关系型数据库 遵循ACID原则
  15. Pillow透视变换进行图片纠偏
  16. 面向对象的三大要素和五大原则
  17. 红米android10参数,红米note9详细参数表_红米note9参数配置详情
  18. Apache Kylin CUBE 剪枝优化和cuboid数量计算公式总结
  19. 初学tms320f2812的一些总结
  20. 生成Git ssh公钥和私钥(ppk)文件

热门文章

  1. 056:cesium 七种方法设置颜色
  2. python列表操作计算列表长度并输出_Python成为专业人士笔记–List列表
  3. 【转】权益证明与共识机制的未来
  4. 煤矿安全检测技术与监控系统
  5. 使用 FVTool 进行滤波器分析
  6. delay在java中有什么用,java中DelayQueue的使用
  7. 拼多多砍价算法 php
  8. cesium加载3dtiles模型贴图到地图
  9. Microsoft Office 2016官方精简版本安装教程
  10. 怎么用python做一个解压缩小工具,以后再也不用下载各种格式的解压缩软件了...