MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
17746 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

15 | 存储过程:如何提高程序的性能和安全性?

你好,我是朱晓峰。今天呢,我们来聊一聊 MySQL 的存储过程。
在我们的超市项目中,每天营业结束后,超市经营者都要计算当日的销量,核算成本和毛利等营业数据,这也就意味着每天都要做重复的数据统计工作。其实,这种数据量大,而且计算过程复杂的场景,就非常适合使用存储过程。
简单来说呢,存储过程就是把一系列 SQL 语句预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。
这样一来,不仅执行效率非常高,而且客户端不需要把所有的 SQL 语句通过网络发给服务器,减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性。
今天,我就借助真实的超市项目,给你介绍一下如何创建和使用存储过程,帮助你提升查询的效率,并且让你开发的应用更加简洁安全。

如何创建存储过程?

在创建存储过程的时候,我们需要用到关键字 CREATE PROCEDURE。具体的语法结构如下:
CREATE PROCEDURE 存储过程名 ([ IN | OUT | INOUT] 参数名称 类型)程序体
接下来,我以超市的日结计算为例,给你讲一讲怎么创建存储过程。当然,为了方便你理解,我对计算的过程进行了简化。
假设在日结计算中,我们需要统计每天的单品销售,包括销售数量、销售金额、成本、毛利、毛利率等。同时,我们还要把计算出来的结果存入单品统计表中。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

MySQL存储过程是提高程序性能和安全性的重要工具。通过将一系列SQL语句预先存储在服务器上,可以提高执行效率,减少网络传输,降低SQL语句暴露风险,提高数据查询安全性。本文以超市项目为例,详细介绍了如何创建和使用存储过程,以及存储过程的参数定义和程序体操作步骤。通过示例展示了创建存储过程的语法结构和具体操作步骤,帮助读者快速了解存储过程的实际应用。 文章详实地介绍了存储过程的程序体,包括变量定义、时间计算、数据处理等具体操作步骤。同时,还介绍了如何查看、调用、修改和删除存储过程,为读者提供了全面的操作指南。此外,文章还提到了存储过程的优点和缺点,以及在开发过程中的一些注意事项和思考题,为读者提供了更多的思考和讨论空间。 总的来说,本文内容详实,适合开发人员和数据库管理员阅读,能够帮助他们提升查询效率,简化开发应用,提高数据安全性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 朱晓峰
    置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了视图。下面是思考题的答案: 第一步,创建门票信息表(demo.tickets)和类别信息表(demo.ticketkind) CREATE TABLE demo.tickets ( id INT PRIMARY KEY AUTO_INCREMENT, tname TEXT, typeid INT, balance INT ); CREATE TABLE demo.ticketkind ( typeid INT PRIMARY KEY AUTO_INCREMENT, opentime TIME, closetime TIME ); 第二步,创建视图: CREATE VIEW demo.vTickets AS SELECT a.tname, a.balance FROM demo.tickets AS a JOIN demo.ticketkind AS b ON (a.typeid = b.typeid) WHERE NOW() > b.opentime AND NOW() < b.closetime;
    2021-05-17
    2
    1
  • undefined
    #不负责任的评论# 互联网公司大都不爱用存储过程,在阿里巴巴发布的Java开发手册中,明确禁止了存储过程的使用。 "【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。" 主要原因大致为:不易测试,难以调试,版本控制困难…… 不过对于商用数据库和部分传统软件业务,还是值得使用的。

    作者回复: 还是要根据实际的应用场景来决定是否使用

    2021-04-13
    7
  • lesserror
    一个番茄钟,补上这一讲的内容。最近实在太忙了。 另外,需要指出这里老师的存储过程代码中的参数类型是TEXT,而不是文中所说的DATETIME类型。 像视图、存储过程、游标......这些概念从伴随MySQL很久了,虽然实际开发中很少用到。但是我们也必须了解,建立起自己完整的知识体系。

    作者回复: 感谢指正,这个地方确实应该是TEXT类型,已经改过了。

    2021-04-15
    3
  • floating
    课后思考题: mysql> drop procedure if exists demo.proc_adder -> ; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> delimiter // mysql> create procedure demo.proc_adder(in a int, out b int) -> begin -> set b = a + 1; -> end -> // Query OK, 0 rows affected (0.01 sec) mysql> delimiter ; mysql> set @a = 5; Query OK, 0 rows affected (0.00 sec) mysql> call demo.proc_adder(@a, @b); Query OK, 0 rows affected (0.00 sec) mysql> select @b as sum; +------+ | sum | +------+ | 6 | +------+ 1 row in set (0.00 sec)

    作者回复: 请参考思考题答案

    2021-04-19
    2
    2
  • Jun
    老师能否解释一下,为什么输入参数trandate的类型用text而不是date?

    作者回复: 主要是因为TEXT类型比较方便调试和调用,

    2021-07-13
    2
    1
  • 追忆似水年华
    在对时间进行判断那里,“b.transdate>startdate AND b.transdate<enddate” 这条语句漏掉了当天 00:00:00 这个时刻的记录,是不是改写成 “b.transdate>=startdate AND b.transdate<enddate” 更合适一些? 另外“这里我使用 CASE 函数来解决销售金额为 0 时计算毛利的问题”,这里应该是解决销售金额为 0 时,计算毛利率的问题吧?

    作者回复: 非常感谢你的认真阅读。 1. 这个地方用“=”来包含00:00:00时刻,是更加严谨的,文稿的例子中,由于客户不存在00:00:00时刻营业的情况,所以没有把这个时刻包含进去 2. 确实是计算毛利率时才会出现被零除的问题,我已经请后台纠正。

    2021-06-06
    1
  • giteebravo
    本节课需要掌握关于存储过程的 创建/查看/调用/修改/删除/调试 其中调试需要重点关注

    作者回复: 好的

    2021-04-14
    1
  • Geek_3254e0
    CREATE TABLE IF NOT EXISTS aplus1( a VARCHAR(5), b VARCHAR(5) )ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO aplus1 VALUES (1,NULL),(2,5),(4,8),(0,3) SELECT * FROM aplus1; TRUNCATE TABLE aplus1; TRUNCATE TABLE bplus; CREATE TABLE IF NOT EXISTS bplus( a VARCHAR(5), b VARCHAR(5) )ENGINE=INNODB DEFAULT CHARSET=utf8 CREATE PROCEDURE plus8() BEGIN INSERT INTO bplus ( a, b ) SELECT c.a, SUM(c.a+1) FROM aplus1 c GROUP BY c.a; END CALL plus8(); SELECT * from bplus;

    作者回复: 请参考思考题答案

    2022-04-28归属地:北京
  • 菜鸟🐤要先飞
    delimiter // create procedure aAddB (in a int,out b int) begin set b = a+1; end // delimiter ; set @b = 0; call aAddB(1,@b); begin

    作者回复: 请参考思考题答案

    2021-05-12
  • Sinvi
    DELIMITER // CREATE PROCEDURE sum_two_num(a INT, INOUT b INT) BEGIN select a + 1 into b; END // DELIMITER ; call sum_two_num(10, @b); select @b;

    作者回复: 请参考思考题答案

    2021-04-20
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部