风咏舞雩 發表於 2023-8-14 00:00:00

详解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">(数量) &gt; 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">数量 &gt; 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 数量&gt;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 数量&gt;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]
查看完整版本: 详解SQL中Group By的使用教程