MySQL中的sum函数用法实例详解

今天分享一下mysql中的sum函数使用。该函数已经成为大家操作mysql数据库中时常用到的一个函数,这个函数统计满足条件行中指定列的和,想必肯定大家都知道了,本身就没什么讲头了,这篇文章主要是通过几个小案例深入了解一下该函数,以及在做mysql查询时如何使用sum函数做优化。

语法分析

sum([distinct] expr) [over_clause]

returns the sum of expr. if the return set has no rows, sum() returns null. the distinct keyword can be used to sum only the distinct values of expr.

if there are no matching rows, sum() returns null.

this function executes as a window function if over_clause is present.

上面几句是mysql官方文档的一个功能描述。这里翻译一下大致的意思是什么。

返回expr表达式的和。如果没有返回行数,则返回null。这里的distinct是为了去掉表达式expr中的重复值。

如果没有匹配到行,该函数也返回null。

如果设置了over_clause,则该函数作为窗口函数执行。对窗口函数不熟悉的,可以去了解一下mysql中的窗口函数。

函数解释

在使用该函数时,我们应该思考一下,该函数是如何统计表达式中的和呢?可能有的程序员会想,这个函数直接去统计满足条件中所有行的总和。这么理解其实也没错,只是表达的不是很准确或者他不够真实了解运行原理。

实际上该函数是根据匹配行的值,一个一个累加起来的。这里举个例子,在一个订单表中满足条件的有10行数据,我们需要统计订单中的总价,sum的初始值是0,在匹配到第一行时,订单价格是10,此时sum就变成10,匹配到第二行,订单价格是20,这时候sum就是30。第三行订单价格是50,这时候sum就是80。按照这种方式依次累加。

 

实例演示

假设有下面一张表(delivery),表结构如下:

delivery_id 是表的主键。

该表保存着顾客的食物配送信息,顾客在某个日期下了订单,并指定了一个期望的配送日期(和下单日期相同或者在那之后)。如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。

里面有如下数据:

实例一

统计出该表中所有的订单总金额。这里就很简单了,也是我们常用的使用方式,直接sum()参数填写某一个列就行了。按照上面的语法规则应该是一个表达式,实际上一列也是一个表达式。

select sum(order_money) from delivery;

实例二

写一条 sql 查询语句获取即时订单所占的百分比, 保留两位小数。这个可能就有一点点难度了,因为你很少用这个语法,如果你用过,就会发现也很简单。

首先你要理解,既然是查询某一个类型的占比,肯定就需要统计总和。我们可以分别去统计到订单总和sum1,然后再去统计即时订单总和sum1,然后再去统计即时订单总和sum1,然后再去统计即时订单总和sum2。然后在相除就可以了。但是这里明确要求一条sql语句。那该如何解决呢?

这里就需要你深入了解一下sum的运行原理,我们可以设想我们一行一行的去读取数据,然后让sum一行一行的累计起来,是不是就可以得到sum2的综合了?至于sum2的综合了?至于sum2的综合了?至于sum1肯定很好统计,直接是表中行数的综合。

题解方式一:

select round (

 sum(case when order_date = customer_pref_delivery_date then1 else0 end) /

 count(*) * 100,

 2

) asimmediate_percentage

fromdelivery

题解方式二:

select round (

 sum(order_date = customer_pref_delivery_date) /

 count(*) * 100,

 2

) asimmediate_percentage

from delivery

这里当sum表达式满足条件,返回1,每次读到满足的一行数据,sum都加1,最后数据读完sum也就加完了。因此满足条件的总条数就出来了。

到此这篇关于mysql中sum函数使用的文章就介绍到这了,希望对大家有所帮助!

最后,特别推荐一个分享C/C++和算法的优质内容,学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!

还没关注的小伙伴,可以长按关注一下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值