一篇文章带你了解数据库中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)>=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]