mysql sum 符合记录_「19」用简单案例掌握MySQL三大循环方法

上一篇文章学习了存储过程,其中遗留的一个问题就是:存储过程中封装的SQL语句块如果碰到类似循环、判断、游标及多项混合等复杂的语句,那可是相当令人头痛的事情啊。

我自己是深有体会的!因为读懂这样的存储过程真的很令人抓狂!

33c35194d03c20b436e5734d575ae68b.png

本文就来通过简单案例从本质上掌握MySQL中三大循环方法。

既然要用案例,我们当然不能缺少数据准备的过程。好在我已经有一种平时记录开支的习惯,那就用这个日常开支记录表做案例。

表结构如下图:共有6个字段。

01aeb3ee3b610fc61568cf835655293d.png

其次,我们确定下要如何使用这个表。

由于涉及的是日常开支,为更好地展示循环的效果,我采用逐条读取记录取每条记录金额汇总,得到总金额,再与直接求和结果对比,看看效果如何!

看看金额求和结果:

fc9580af92a965fd885014c8efd0265f.png

【1】While循环

这是在计算机语言中最常见的一种循环方式。先看看它的语法格式:

while 条件判断 do    语句块; end while;

其次,我们创建一个存储过程来实现逐条记录汇总金额的目的。

delimiter // drop procedure if exists tj_jine; create procedure tj_jine(out jine DECIMAL(18,2))  # 定义一个输出变量begin    DECLARE num int;DECLARE i int;DECLARE charge DECIMAL(18,2);    set i = 1,jine = 0.00; SELECT max(recordID) INTO num FROM live_cost_income_info;    while i <= num do        SELECT IFNULL(charge_rmb,0.00) INTO charge FROM live_cost_income_info WHERE recordID = i;        set i = i + 1;set jine = jine + charge;    end while;    select jine;end//

存储过程编译成功后,再执行下看效果:

set @jine = 0;call tj_jine(@jine);
38e79f3b62a3c8ca69f36a8dd2a42e28.png

【结论】与采用sum()函数的效果一致!

【2】Repeat循环

这个循环方式应该是MySQL所特有的,但看看其语法格式后其实也很好理解:

REPEATstatement_listUNTIL search_condition END REPEAT;

接着看案例:

delimiter // drop procedure if exists tj_jine2; create procedure tj_jine2(out jine DECIMAL(18,2))begin    DECLARE num int;DECLARE i int;DECLARE charge DECIMAL(18,2);    set i = 1,jine = 0.00; SELECT max(recordID) INTO num FROM live_cost_income_info;    repeat        SELECT IFNULL(charge_rmb,0.00) INTO charge FROM live_cost_income_info WHERE recordID = i;        set i = i + 1;set jine = jine + charge;    until i > num end repeat;    select jine;end//

最后看执行效果:

set @jine = 0;call tj_jine2(@jine);
00645f42c1202be1c7966430c19d57d6.png

【结论】与采用sum()函数的效果一致!

【3】Loop循环

这也是常见的循环方式,特别是用过Oracle数据库的人最熟悉不过了。也是先看看其语法格式:

label: LOOPstatement_listIF exit_condition THENLEAVE label; END IF; END LOOP label;

接着看案例:

delimiter // drop procedure if exists tj_jine3; create procedure tj_jine3(out jine DECIMAL(18,2))begin    DECLARE num int;DECLARE i int;DECLARE charge DECIMAL(18,2);    set i = 1,jine = 0.00; SELECT max(recordID) INTO num FROM live_cost_income_info;    lp:loop    # 需要执行的循环体        SELECT IFNULL(charge_rmb,0.00) INTO charge FROM live_cost_income_info WHERE recordID = i;        set i = i + 1;set jine = jine + charge;if  i > num then   LEAVE lp;end if;end loop;    select jine;end//

最后看执行效果:

set @jine = 0;call tj_jine3(@jine);
40ae786abc66e72efe8b8f7257156048.png

【结论】与采用sum()函数的效果一致!

总结

MySQL三种循环方式其实都是与现实中的循环思维吻合,即:

  • 继续循环的条件是什么;
  • 终止循环的条件是什么;
  • 是对什么操作进行循环?
  • 最后要输出什么结果?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值