MySQL 案例实战--MySQL数据库 存储过程 存储函数
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数据库 存储过程 存储函数相关推荐
- MySQL 案例实战--MySQL 数据库 之 冷备份
MySQL 数据库 之 冷备份 前言 一.数据库备份类型 二.数据库备份的内容 三. MySQL 数据库 之 冷备份 1.环境准备 2.备份要求 3.备份流程 前言 本环境是基于 Centos 7.8 ...
- MySQL 案例实战--MySQL 数据库 之 温备份 热备份
MySQL 数据库 之 温备份 & 热备份 前言 一.完全备份方案 二.增量备份方案 三.GTID 备份 四.mydumper 备份 五.LVM 快照备份 六.xtrabackup 备份 1. ...
- MySQL 案例实战--MySQL 基于Mycat实现读写分离
MySQL 基于Mycat实现读写分离 前言 一.什么是读写分离? 二.MySQL 读写分离解决方案 三.MySQL 基于Mycat实现读写分离 四.Mycat-web 管理部署 前言 本环境是基于 ...
- MySQL 案例实战--MySQL数据库 单表查询 一
前言 本环境是基于 Centos 7.8 系统构建MySQL-5.7.14 具体构建,请参考 MySQL-5.7.14 环境构建 素材准备: DROP TABLE IF EXISTS `course` ...
- WebDay18 MySQL存储过程 存储函数 触发器 事务
MySQL存储过程 存储函数 触发器 事务 一.MySQL存储过程和函数 1.存储过程和函数的概念 2.存储过程和函数的好处 3.存储过程和函数的区别 4.创建存储过程 5.调用存储过程 6.查看存储 ...
- Day463.视图存储过程存储函数 -mysql
视图 1. 常见的数据库对象 对象 描述 表(TABLE) 表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录 数据字典 就是系统表,存放数据库相关信息的表.系统表的数据通常由数据库系 ...
- 视图存储过程存储函数
文章目录 视图 常见数据库对象 视图概述 为什么使用视图? 视图的理解 创建视图 创建单表视图 创建多表联合视图 基于视图创建视图 查看视图 更新视图的数据 一般情况 不可更新的视图 修改.删除视图 ...
- Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表.---查询语句创建表 create table emp as ...
- mysql 登录默认实例_【MySQL案例】mysql本机登录-S失灵_mysql
[mysql案例]mysql本机登录-S失效 1.1.1. mysql本机登录mysql时,-S参数失效 [环境描述] mysql5.5.14 [问题描述] 配置了多实例 实例1 实例2 datadi ...
最新文章
- 加入新e时代建站网后,我可以做什么
- java并发编程与线程安全
- robotframework如何设计web页面的自动化---启动robotframework ride
- 如何在IE浏览器里面定位到关键字的位置(页面代码)和这个关键字位置模块的请求
- Opencv FFmpeg Ubuntu下编译问题
- MySQL Create Table创建表
- maven更新总结与tomcat发布方法总结
- UVa 674 - Coin Change
- 自定义表单提交后返回上一页修改
- 实施工程师是干嘛的_CTO大怒:300万建设数据中台,啥也没看见,我要它干嘛?...
- cafebabe.cc/nazo解答笔记
- cv2.VideoCapture.get()用法
- 我的Python心路历程 第十期 (10.5 股票实战之数据可视化曲线)
- 关系型数据库 遵循ACID原则
- Pillow透视变换进行图片纠偏
- 面向对象的三大要素和五大原则
- 红米android10参数,红米note9详细参数表_红米note9参数配置详情
- Apache Kylin CUBE 剪枝优化和cuboid数量计算公式总结
- 初学tms320f2812的一些总结
- 生成Git ssh公钥和私钥(ppk)文件