聚合函数和group by的关系详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>前言</li><li>
聚合函数介绍</li><li>
group by介绍</li><li>
解释聚合函数和group by的关系</li><li>
使用group by和聚合函数需要注意的地方</li><li>
总结</li></ul></div><div id="navcategory"><h5 class="catalogue">
目录</h5><ul class="first_class_ul list-paddingleft-2"><li>
前言</li><li>
聚合函数介绍</li><li>
group by介绍</li><li>
解释聚合函数和group by的关系</li><li>
使用group by和聚合函数需要注意的地方</li><li>
总结</li></ul></div><p class="maodian"><br/></p><p class="maodian"></p><h2>
前言</h2><p>
world:世界表格<br/>
continent:大洲名称<br/>
name:国家名称<br/>
population:人口数量</p><p class="maodian"><br/></p><p class="maodian"></p><h2>
聚合函数介绍</h2><table><thead><tr class="firstRow"><th>
sum()</th><th>
求和函数</th></tr></thead><tbody><tr><td>
avg()</td><td>
求平均值函数</td></tr><tr><td>
max()</td><td>
求最大值函数</td></tr><tr><td>
min()</td><td>
求最小值函数</td></tr><tr><td>
count()</td><td>
求行数函数</td></tr></tbody></table><p class="maodian"><br/></p><p class="maodian"></p><h2>
group by介绍</h2><p>
group up + 字段名:规定哪个字段分组聚合<br/>
在单独使用使用时,作用为分组去重 结果与<strong>distinct</strong>一样,但是逻辑并不一样:先对字段值相同的分为一个区,再将同区的拿出来进行分组,对应多少值就分多少组。分组就是将相同的字段进行剔除。简单来说,就是打破了表格的格式生成了一张新的表格。</p><p><img style="max-width:100%!important;height:auto!important;" title="聚合函数和group by的关系详解" alt="聚合函数和group by的关系详解" src="https://zhuji.jb51.net/uploads/img/202305/d639cf298e5d2d54f00c2631ef0a8cf2.jpg"/></p><p><img style="max-width:100%!important;height:auto!important;" title="聚合函数和group by的关系详解" alt="聚合函数和group by的关系详解" src="https://zhuji.jb51.net/uploads/img/202305/f86f19489a72b48a3fc7695acbb94a0f.jpg"/></p><p>
例如在上面这张表格就是执行group up后形成的分区结果,将相同的字段值分在了一起。下面的表格即是执行group by分组的结果,基于上面分区的结果,进行了去重的分组。</p><p><img style="max-width:100%!important;height:auto!important;" title="聚合函数和group by的关系详解" alt="聚合函数和group by的关系详解" src="https://zhuji.jb51.net/uploads/img/202305/f0b6756699aaa363e623a14327760cd0.jpg"/></p><p class="maodian"><br/></p><p class="maodian"></p><h2>
解释聚合函数和group by的关系</h2><p>
那么为什么使用group by会形成这样的结果呢?我们可以使用上聚合函数进行分析原因,执行下面一句sql代码。</p><div class="jb51code"><div><div class="syntaxhighlighterjava" id="highlighter_266598"><div class="toolbar">?</div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><td class="gutter"><div class="line number1 index0 alt2">
1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java plain">select continent,count(name) from world group by continent</code></div></div></td></tr></tbody></table></div></div></div><p>
结果为</p><p><img style="max-width:100%!important;height:auto!important;" title="聚合函数和group by的关系详解" alt="聚合函数和group by的关系详解" src="https://zhuji.jb51.net/uploads/img/202305/3ae1954e2cab75983a4aac8dc8dcd418.jpg"/></p><p>
那么我们试着将group by continent和continent去掉,得到以下结果</p><p><img style="max-width:100%!important;height:auto!important;" title="聚合函数和group by的关系详解" alt="聚合函数和group by的关系详解" src="https://zhuji.jb51.net/uploads/img/202305/64bc1107e4a2bb23ba74f26539c927f5.jpg"/></p><p>
结果执行后查询出来 <strong>count(name)</strong> 就只是所有 <strong>name</strong> 这一列的行数的总合,并不能将每个大洲(continent)进行分组统计出来每个大洲所有国家(name)的数量。</p><p>
这就是聚合函数和group by联合使用的作用,帮助聚合函数找到分组后的表格进行计算,在这一句</p><div class="jb51code"><div><div class="syntaxhighlighterjava" id="highlighter_167897"><div class="toolbar">?</div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><td class="gutter"><div class="line number1 index0 alt2">
1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java plain">select continent,count(name) from world group by continent</code></div></div></td></tr></tbody></table></div></div></div><p>
sql语句中是先进行了group by的分组,在进行select continent,最后在进行count(name),基于的就是group by后的分组进行计算。</p><p>
我们可以将continent的字段名删除,查看结果是否统一,作为印证。</p><p><img style="max-width:100%!important;height:auto!important;" title="聚合函数和group by的关系详解" alt="聚合函数和group by的关系详解" src="https://zhuji.jb51.net/uploads/img/202305/36a592f1a4c0efcc027861d3c57d631d.jpg"/></p><p>
很明显我们无论有没有将continent进行显示,结果都是一样的。</p><p>
通过这次测试,我们就可以得出相对应的结论:<strong>在group up执行的时候,就已经将表格生成出来了,select只是选择展示和不展示出来而已,对于结果并没有影响。而聚合函数的作用就是在生成出来新的表格内进行计算,舍弃了没有进行分组的表格。</strong></p><p class="maodian"><br/></p><p class="maodian"></p><h2>
使用group by和聚合函数需要注意的地方</h2><p>
在使用group up子句时,select只能使用聚合函数和group up引用的字段,否则会报错!</p><p>
尝试执行下列sql语句:</p><div class="jb51code"><div><div class="syntaxhighlighterjava" id="highlighter_574489"><div class="toolbar">?</div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><td class="gutter"><div class="line number1 index0 alt2">
1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java plain">select continent,count(name),population from world group by continent</code></div></div></td></tr></tbody></table></div></div></div><p><img style="max-width:100%!important;height:auto!important;" title="聚合函数和group by的关系详解" alt="聚合函数和group by的关系详解" src="https://zhuji.jb51.net/uploads/img/202305/6dae1df9e53775836129eede800a6e71.jpg"/></p><p>
为什么会出现报错呢,因为在这句sql语句中,group by已经先运行了,所以select不能出现在group by中没有的字段,只能基于在聚合依据的这个表中进行字段匹配。</p><p class="maodian"><br/></p><p class="maodian"></p><h2>
总结</h2><p>
到此这篇关于聚合函数和group by的关系详解的文章就介绍到这了,更多相关聚合函数和group by内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!</p><p>
原文链接:https://blog.csdn.net/thetheflower/article/details/122267999</p>
頁:
[1]