Loading... <img class=" lazyloaded" title="1480776820928760.jpg" src="https://www.zsythink.net/wp-content/uploads/ueditor/php/upload/image/20161203/1480776820928760.jpg" alt="mysql.jpg" data-src="https://www.zsythink.net/wp-content/uploads/ueditor/php/upload/image/20161203/1480776820928760.jpg" style=""> 前文总结了select语句的基本用法,这篇文章总结一下mysql中select语句的分组与聚合。 在本博客中,”mysql”是一个系列文章,这些文章主要对mysql/mariadb的常用知识点进行了总结,每一篇博客总结的知识点有所不同,具体内容可参考mysql文章列表。 mysql文章列表直达链接:<a href="https://www.zsythink.net/archives/tag/mysql/" target="_blank" rel="noopener">mysql知识点总结</a> 我们先聊聊select语句中group by 的使用,见名知义,group by就是用来分组的。 而我们之所以要对数据进行分组,往往是为了在分组以后,对分组后的数据进行聚合操作。我们先从简单的操作开始总结。 首先查看一下student表中的数据。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_1.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_1.png" style=""> students表中的数据如上图所示。 现在,我们使用students表中的数据,进行分组,我们可以根据性别分组,也可以根据年龄分组。 比如,我们根据性别对上述数据进行分组,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_2.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_2.png" style=""> 可以看到,根据性别分组后,只分出了两组,因为性别只有男和女两种性别,所以只分出了两组。 而且每组只显示一条数据,也就是每组的第一条数据,注意,这可能与我们想象的不太一样,分组后每组只显示一条数据。 我们说过,分组的目的往往是对分组后的数据进行”聚合操作”,设么意思呢?我们先看示例,看完示例再解释,示例如下 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_3.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_3.png" style=""> 上例中,我们通过性别对数据进行了分组,然后算出了每组中的人员数量,也就是说,我们算出了女性有10人,男性有15人。 而上例中的count(stuid)就是一种”聚合操作”,count()是一种聚合函数,这个聚合函数能够算出对应数据的条目数量。 上例中的count(stuid)表示算出分组后的每组的stuid的数量,这就是所谓的”分组的目的往往是为了聚合操作”的含义。 那么,我们再举一个列子,比如,我们仍然按照性别分组,然后,算出男生与女生的平均年龄,可以使用如下语句。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_4.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_4.png" style=""> 可以看到,根据性别分组,然后算出每组的平均年龄,男性平均年龄33(普遍成熟稳重),女性平均年龄19(花姑娘大大滴) 聪明如你一定猜到了,avg( )也是一种聚合函数,avg(age)就是求年龄的平均值。 那么,mysql中常用的聚合函数有哪些呢,如下? min(col)返回指定列的最小值 max(col)返回指定列的最大值 avg(col)返回指定咧的平均值 count(col)返回指定列中非null值的个数 sum(col)返回指定列的所有值之和 group_concat(col)返回指定列的值,但是会分组显示,也就是说分组显示指定列组合后的结果,这样说不容易明白,我们来看个例子,比如,将学生表中的学生按性别分组,并且显示男生组有哪些学生,女生组有哪些学生,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_5.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_5.png" style=""> 那么,如果我们想要对分组后的信息再次过滤,该怎么办呢,举个例子,如下: <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_6.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/01/011217_0208_6.png" style=""> 从上例可以看出,如果想要对分组过后的信息再次过滤,可以使用having关键字。 好了,此处总结一些常用示例: 查询students表,以性别为分组,求出分组后的年龄之和。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">select gender,</span><span class="enlighter-m0">sum</span><span class="enlighter-g1">(</span><span class="enlighter-text">age</span><span class="enlighter-g1">)</span><span class="enlighter-text"> from students group by gender;</span></div> </div> </div> </div> 查询students表,以classid分组,显示平均年龄大于25的classid。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">select classid,</span><span class="enlighter-m0">avg</span><span class="enlighter-g1">(</span><span class="enlighter-text">age</span><span class="enlighter-g1">)</span><span class="enlighter-text"> as avgage from students group by classid having avgage </span><span class="enlighter-g1">></span> <span class="enlighter-n1">25</span><span class="enlighter-text">;</span></div> </div> </div> </div> 查询students表,以性别字段gender分组,显示各组中年龄大于19的学员的年龄的总和。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">select </span><span class="enlighter-m0">sum</span><span class="enlighter-g1">(</span><span class="enlighter-text">age</span><span class="enlighter-g1">)</span><span class="enlighter-text"> from students where age </span><span class="enlighter-g1">></span> <span class="enlighter-n1">19</span><span class="enlighter-text"> group by gender;</span></div> </div> </div> </div> 分组与聚合先总结到这里,下一篇文章中将会总结多表查询的select语句,直达链接 <a href="https://www.zsythink.net/archives/1105" target="_blank" rel="noopener">select语句总结之多表查询</a> 转载自朱双印日志https://www.zsythink.net/archives/1058 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏