来事 發表於 2023-8-16 00:00:00

一篇文章带你了解数据库中group by的用法

<p>
        <span><strong>前言</strong></span></p>
<p>
        本章主要介绍数据库中group by的用法,也是我们在使用数据库时非常基础的一个知识点。并且也会涉及join的使用,关于join的用法,可以看我写的上一篇文章:带你了解数据库中join的用法 如有错误还请大家及时指出~</p>
<blockquote>
        <p>
                以下都是采用mysql数据库</p>
</blockquote>
<p>
        <span><strong>group by</strong></span></p>
<p>
        <strong>概念</strong></p>
<p>
        group by语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(group)”。<br>
        作用:通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。</p>
<blockquote>
        <p>
                注意:group by 是先排序后分组!</p>
</blockquote>
<p>
        <strong>语法</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_195723">
                        <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>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">expression1, expression2, ... expression_n, </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">aggregate_function (aggregate_expression)</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql keyword">from</code> <code class="sql plain">tables</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql plain">[</code><code class="sql keyword">where</code> <code class="sql plain">conditions]</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql keyword">group</code> <code class="sql keyword">by</code> <code class="sql plain">expression1, expression2, ... expression_n</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql plain">[</code><code class="sql keyword">order</code> <code class="sql keyword">by</code> <code class="sql plain">expression [ </code><code class="sql keyword">asc</code> <code class="sql plain">| </code><code class="sql keyword">desc</code> <code class="sql plain">]];</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong>语法说明</strong></p>
<ul>
<li>
                expression1,expression2,... expression_n<br>
                表达式未封装在聚合函数中,必须包含在sql语句末尾的group by子句中。</li>
        <li>
                aggregate_function<br>
                这是一个聚合函数,例如sum,count,min,max或avg函数。</li>
        <li>
                aggregate_expression<br>
                这是将使用aggregate_function的列或表达式。</li>
        <li>
                tables<br>
                您希望从中检索记录的表。from子句中必须至少列出一个表。</li>
        <li>
                where<br>
                可选的。这些是要选择的记录必须满足的条件。</li>
        <li>
                order by表达式<br>
                可选的。用于对结果集中的记录进行排序的表达式。如果提供了多个表达式,则值应以逗号分隔。</li>
        <li>
                asc<br>
                可选的。asc按表达式按升序对结果集进行排序。如果没有修饰符是提供者,则这是默认行为。</li>
        <li>
                desc<br>
                可选的。desc按表达式按降序对结果集进行排序。</li>
</ul>
<p>
        <strong>常用聚合函数</strong></p>
<ul>
<li>
                count() 计数</li>
        <li>
                sum() 求和</li>
        <li>
                avg() 平均数</li>
        <li>
                max() 最大值</li>
        <li>
                min() 最小值</li>
</ul>
<p>
        <strong>举例</strong></p>
<p>
        我们以下面两张表举例:</p>
<p>
        学生表(student) </p>
<p>
         </p>
<table>
<thead><tr>
<th>
                                id</th>
                        <th>
                                studentname</th>
                        <th>
                                studentclassid</th>
                </tr></thead>
<tbody>
<tr>
<td>
                                1</td>
                        <td>
                                小明</td>
                        <td>
                                1</td>
                </tr>
<tr>
<td>
                                2</td>
                        <td>
                                小红</td>
                        <td>
                                2</td>
                </tr>
<tr>
<td>
                                3</td>
                        <td>
                                小兰</td>
                        <td>
                                3</td>
                </tr>
<tr>
<td>
                                4</td>
                        <td>
                                小吕</td>
                        <td>
                                2</td>
                </tr>
<tr>
<td>
                                5</td>
                        <td>
                                小梓</td>
                        <td>
                                1</td>
                </tr>
</tbody>
</table>
<p>
         </p>
<p>
        班级表(class)</p>
<p>
         </p>
<table>
<thead><tr>
<th>
                                classid</th>
                        <th>
                                classname</th>
                </tr></thead>
<tbody>
<tr>
<td>
                                1</td>
                        <td>
                                软件一班</td>
                </tr>
<tr>
<td>
                                2</td>
                        <td>
                                软件二班</td>
                </tr>
<tr>
<td>
                                3</td>
                        <td>
                                软件三班</td>
                </tr>
</tbody>
</table>
<p>
         </p>
<p>
        计算每个班都有多少学生?</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_709965">
                        <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>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">cl.classname,</code><code class="sql color2">count</code><code class="sql plain">(stu.studentclassid) </code><code class="sql keyword">as</code> <code class="sql plain">studentnum</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql keyword">from</code> <code class="sql plain">student stu </code><code class="sql color2">left</code> <code class="sql color1">join</code> <code class="sql plain">class cl </code><code class="sql keyword">on</code> <code class="sql plain">stu.studentclassid = cl.classid</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql keyword">group</code> <code class="sql keyword">by</code> <code class="sql plain">cl.classname;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        计算结果:</p>
<p>
         </p>
<table>
<thead><tr>
<th>
                                classname</th>
                        <th>
                                studentname</th>
                </tr></thead>
<tbody>
<tr>
<td>
                                软件一班</td>
                        <td>
                                2</td>
                </tr>
<tr>
<td>
                                软件二班</td>
                        <td>
                                2</td>
                </tr>
<tr>
<td>
                                软件三班</td>
                        <td>
                                1</td>
                </tr>
</tbody>
</table>
<p>
         </p>
<p>
        <span><strong>having</strong></span></p>
<p>
        having语句通常与group by语句联合使用,用来过滤由group by语句返回的记录集。</p>
<p>
        having语句的存在弥补了where关键字不能与聚合函数联合使用的不足。</p>
<p>
        通俗的说:where过滤行,having过滤组</p>
<p>
        <strong>语法</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_138201">
                        <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>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">expression1, expression2, ... expression_n, </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql spaces">  </code><code class="sql plain">aggregate_function (aggregate_expression)</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql keyword">from</code> <code class="sql plain">tables</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql plain">[</code><code class="sql keyword">where</code> <code class="sql plain">conditions]</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql keyword">group</code> <code class="sql keyword">by</code> <code class="sql plain">expression1, expression2, ... expression_n</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong>语法说明</strong></p>
<p>
        having condition这是另一个条件,仅应用于聚合结果以限制返回行的组。只有那些条件评估为true的组才会包含在结果集中。</p>
<p>
        <strong>举例</strong></p>
<p>
        采用上面两张数据表</p>
<p>
        查询学生人数大于2人的班级?</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_329996">
                        <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>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">cl.classname,</code><code class="sql color2">count</code><code class="sql plain">(stu.studentclassid) </code><code class="sql keyword">as</code> <code class="sql plain">studentnum</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql keyword">from</code> <code class="sql plain">student stu </code><code class="sql color2">left</code> <code class="sql color1">join</code> <code class="sql plain">class cl </code><code class="sql keyword">on</code> <code class="sql plain">stu.studentclassid = cl.classid</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql keyword">group</code> <code class="sql keyword">by</code> <code class="sql plain">cl.classname</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql keyword">having</code> <code class="sql color2">count</code><code class="sql plain">(stu.studentclassid)&gt;=2;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        计算结果:</p>
<p>
         </p>
<table>
<thead><tr>
<th>
                                classname</th>
                        <th>
                                studentname</th>
                </tr></thead>
<tbody>
<tr>
<td>
                                软件一班</td>
                        <td>
                                2</td>
                </tr>
<tr>
<td>
                                软件二班</td>
                        <td>
                                2</td>
                </tr>
</tbody>
</table>
<p>
         </p>
<p>
        <span><strong>小结</strong></span></p>
<ul>
<li>
                当group by 与聚合函数配合使用时,功能为分组后计算</li>
        <li>
                当group by 与 having配合使用时,功能为分组后过滤,获得满足条件的分组的返回结果。</li>
        <li>
                having与where区别:where过滤行,having过滤组</li>
</ul>
<p>
        <span><strong>文末</strong></span></p>
<p>
        本章节主要简单介绍了数据库中group by的用法,并没有详细的展开讲解,相信大家只要把基础打扎实,再复杂的查询也可以通过分而治之的思想来解决。</p>
<p>
        好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。</p>
<p>
        原文链接:https://juejin.im/post/5cab598c6fb9a068a84fc405</p>
頁: [1]
查看完整版本: 一篇文章带你了解数据库中group by的用法