详解SQL中Group By的使用教程
<p><span><strong>1、概述</strong></span></p>
<p>
“group by”从字面意义上理解就是根据“by”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。</p>
<p>
2、原始表</p>
<p>
<img title="详解SQL中Group By的使用教程" alt="详解SQL中Group By的使用教程" src="https://zhuji.jb51.net/uploads/img/202305/4d2135a8bc60602f93365fc40911863e.jpg"></p>
<p>
3、简单group by示例1</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_557113">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, </code><code class="sql color2">sum</code><code class="sql plain">(数量) </code><code class="sql keyword">as</code> <code class="sql plain">数量之和</code><code class="sql keyword">from</code> <code class="sql plain">agroup </code><code class="sql keyword">by</code> <code class="sql plain">类别</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
返回结果如下表,实际上就是分类汇总。</p>
<p>
<img title="详解SQL中Group By的使用教程" alt="详解SQL中Group By的使用教程" src="https://zhuji.jb51.net/uploads/img/202305/23e1f1b14f460980e5b2406a7c25bcfe.jpg"></p>
<p>
4、group by 和 order by示例2</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_306395">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, </code><code class="sql color2">sum</code><code class="sql plain">(数量) </code><code class="sql keyword">as</code> <code class="sql plain">数量之和</code><code class="sql keyword">from</code> <code class="sql plain">agroup </code><code class="sql keyword">by</code> <code class="sql plain">类别</code><code class="sql keyword">order</code> <code class="sql keyword">by</code> <code class="sql color2">sum</code><code class="sql plain">(数量) </code><code class="sql keyword">desc</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
返回结果如下表</p>
<p>
<img title="详解SQL中Group By的使用教程" alt="详解SQL中Group By的使用教程" src="https://zhuji.jb51.net/uploads/img/202305/4bbccff3fb24697cec1a28e84a7c44dc.jpg"></p>
<p>
在access中不可以使用“order by 数量之和 desc”,但在sql server中则可以。</p>
<p>
5、group by中select指定的字段限制示例3</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_469441">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, </code><code class="sql color2">sum</code><code class="sql plain">(数量) </code><code class="sql keyword">as</code> <code class="sql plain">数量之和, 摘要</code><code class="sql keyword">from</code> <code class="sql plain">agroup </code><code class="sql keyword">by</code> <code class="sql plain">类别</code><code class="sql keyword">order</code> <code class="sql keyword">by</code> <code class="sql plain">类别 </code><code class="sql keyword">desc</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
示例3执行后会提示下错误,如下图。这就是需要注意的一点,在select指定的字段要么就要包含在group by语句的后面,作为分组的依据;要么就要被包含在聚合函数中。</p>
<p>
<img title="详解SQL中Group By的使用教程" alt="详解SQL中Group By的使用教程" src="https://zhuji.jb51.net/uploads/img/202305/eca568871ee20927ddfe0de0c442f3d2.jpg"></p>
<p>
6、group by all示例4</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_526253">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, 摘要, </code><code class="sql color2">sum</code><code class="sql plain">(数量) </code><code class="sql keyword">as</code> <code class="sql plain">数量之和</code><code class="sql keyword">from</code> <code class="sql plain">agroup </code><code class="sql keyword">by</code> <code class="sql color1">all</code> <code class="sql plain">类别, 摘要</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
示例4中则可以指定“摘要”字段,其原因在于“多列分组”中包含了“摘要字段”,其执行结果如下表</p>
<p>
<img title="详解SQL中Group By的使用教程" alt="详解SQL中Group By的使用教程" src="https://zhuji.jb51.net/uploads/img/202305/41e229ea8020ac6129f7514c5e493c8d.jpg"></p>
<p>
“多列分组”实际上就是就是按照多列(类别+摘要)合并后的值进行分组,示例4中可以看到“a, a2001, 13”为“a, a2001, 11”和“a, a2001, 2”两条记录的合并。</p>
<p>
sql server中虽然支持“group by all”,但microsoft sql server 的未来版本中将删除 group by all,避免在新的开发工作中使用 group by all。access中是不支持“group by all”的,但access中同样支持多列分组,上述sql server中的sql在access可以写成</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_492178">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, 摘要, </code><code class="sql color2">sum</code><code class="sql plain">(数量) </code><code class="sql keyword">as</code> <code class="sql plain">数量之和</code><code class="sql keyword">from</code> <code class="sql plain">agroup </code><code class="sql keyword">by</code> <code class="sql plain">类别, 摘要</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
</p>
<p>
7、group by与聚合函数</p>
<p>
在示例3中提到group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中,常见的聚合函数如下表:</p>
<p>
</p>
<table>
<thead><tr>
<th>
函数</th>
<th>
作用</th>
<th>
支持性</th>
</tr></thead>
<tbody>
<tr>
<td>
sum(列名)</td>
<td>
求和</td>
<td>
</td>
</tr>
<tr>
<td>
max(列名)</td>
<td>
最大值</td>
<td>
</td>
</tr>
<tr>
<td>
min(列名)</td>
<td>
最小值</td>
<td>
</td>
</tr>
<tr>
<td>
avg(列名)</td>
<td>
平均值</td>
<td>
</td>
</tr>
<tr>
<td>
first(列名)</td>
<td>
第一条记录</td>
<td>
仅access支持</td>
</tr>
<tr>
<td>
last(列名)</td>
<td>
最后一条记录</td>
<td>
仅access支持</td>
</tr>
<tr>
<td>
count(列名)</td>
<td>
统计记录数</td>
<td>
注意和count(*)的区别</td>
</tr>
</tbody>
</table>
<p>
</p>
<p>
示例5:求各组平均值</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_934147">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, </code><code class="sql color2">avg</code><code class="sql plain">(数量) </code><code class="sql keyword">as</code> <code class="sql plain">平均值 </code><code class="sql keyword">from</code> <code class="sql plain">a </code><code class="sql keyword">group</code> <code class="sql keyword">by</code> <code class="sql plain">类别;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
示例6:求各组记录数目</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_5430">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, </code><code class="sql color2">count</code><code class="sql plain">(*) </code><code class="sql keyword">as</code> <code class="sql plain">记录数 </code><code class="sql keyword">from</code> <code class="sql plain">a </code><code class="sql keyword">group</code> <code class="sql keyword">by</code> <code class="sql plain">类别;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
示例7:求各组记录数目</p>
<p>
</p>
<p>
8、having与where的区别</p>
<ul>
<li>
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。</li>
<li>
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。</li>
</ul>
<p>
示例8</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_353185">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, </code><code class="sql color2">sum</code><code class="sql plain">(数量) </code><code class="sql keyword">as</code> <code class="sql plain">数量之和 </code><code class="sql keyword">from</code> <code class="sql plain">agroup </code><code class="sql keyword">by</code> <code class="sql plain">类别</code><code class="sql keyword">having</code> <code class="sql color2">sum</code><code class="sql plain">(数量) > 18</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
示例9:having和where的联合使用方法</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_643888">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">类别, </code><code class="sql color2">sum</code><code class="sql plain">(数量)</code><code class="sql keyword">from</code> <code class="sql plain">awhere 数量 gt;8group </code><code class="sql keyword">by</code> <code class="sql plain">类别</code><code class="sql keyword">having</code> <code class="sql color2">sum</code><code class="sql plain">(数量) gt; 10</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
</p>
<p>
9、compute 和 compute by</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_476966">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">* </code><code class="sql keyword">from</code> <code class="sql plain">a </code><code class="sql keyword">where</code> <code class="sql plain">数量 > 8</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
执行结果:</p>
<p>
<img title="详解SQL中Group By的使用教程" alt="详解SQL中Group By的使用教程" src="https://zhuji.jb51.net/uploads/img/202305/87b90f11f680ee41e12358b685459bd2.jpg"></p>
<p>
示例10:compute</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_400109">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">*</code><code class="sql keyword">from</code> <code class="sql plain">awhere 数量>8compute </code><code class="sql keyword">max</code><code class="sql plain">(数量),</code><code class="sql keyword">min</code><code class="sql plain">(数量),</code><code class="sql color2">avg</code><code class="sql plain">(数量)</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
执行结果如下:</p>
<p>
<img title="详解SQL中Group By的使用教程" alt="详解SQL中Group By的使用教程" src="https://zhuji.jb51.net/uploads/img/202305/86c4a20282947853f84340c43fb5e706.jpg"></p>
<p>
compute子句能够观察“查询结果”的数据细节或统计各列数据(如例10中max、min和avg),返回结果由select列表和compute统计结果组成。</p>
<p>
示例11:compute by</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_30538">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<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="sql keyword">select</code> <code class="sql plain">*</code><code class="sql keyword">from</code> <code class="sql plain">awhere 数量>8order </code><code class="sql keyword">by</code> <code class="sql plain">类别compute </code><code class="sql keyword">max</code><code class="sql plain">(数量),</code><code class="sql keyword">min</code><code class="sql plain">(数量),</code><code class="sql color2">avg</code><code class="sql plain">(数量) </code><code class="sql keyword">by</code> <code class="sql plain">类别</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
执行结果如下:</p>
<p>
<img title="详解SQL中Group By的使用教程" alt="详解SQL中Group By的使用教程" src="https://zhuji.jb51.net/uploads/img/202305/2d8a7dc43b7ff83349b5d44e205fbb67.jpg"></p>
<p>
示例11与示例10相比多了“order by 类别”和“... by 类别”,示例10的执行结果实际是按照分组(a、b、c)进行了显示,每组都是由改组数据列表和改组数统计结果组成,另外:</p>
<ul>
<li>
compute子句必须与order by子句用一起使用</li>
<li>
compute...by与group by相比,group by 只能得到各组数据的统计结果,而不能看到各组数据</li>
</ul>
<p>
在实际开发中compute与compute by的作用并不是很大,sql server支持compute和compute by,而access并不支持</p>
<p>
<span><strong>总结</strong></span></p>
<p>
以上所述是小编给大家介绍的详解sql中group by的使用教程,希望对大家有所帮助!</p>
<p>
原文链接:https://www.cnblogs.com/eternityz/archive/2020/01/30/12243352.html</p>
頁:
[1]