MySQL聚合函数和GROUP BY子句

MySql聚合函数和GROUP BY

使用该篇文章中建立的数据库http://my.oschina.net/xinxingegeya/blog/311753

 

MySQL聚合函数

SUM, COUNT, MAX, MIN, AVG

mysql> select * from student_course;
+-----+------+-------+
| sid | cid  | score |
+-----+------+-------+
| 01  | 1234 |    10 |
| 01  | 1235 |    90 |
| 02  | 1234 |    70 |
| 02  | 1235 |    90 |
+-----+------+-------+
4 rows in set

 

COUNT函数

SQL COUNT(column_name) 语法

COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):

SELECT COUNT(column_name) FROM table_name

SQL COUNT(*) 语法

COUNT(*) 函数返回表中的记录数:

SELECT COUNT(*) FROM table_name

SQL COUNT(DISTINCT column_name) 语法

COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

SELECT COUNT(DISTINCT column_name) FROM table_name

mysql> select count(score) from student_course;
+--------------+
| count(score) |
+--------------+
|            4 |
+--------------+
1 row in set

 

SUM函数

SUM 函数返回数值列的总数(总额)。

mysql> select sum(score) from student_course;
+------------+
| sum(score) |
+------------+
|        260 |
+------------+
1 row in set

 

MAX函数

MAX 函数返回一列中的最大值。NULL 值不包括在计算中。

mysql> select max(score) from student_course;
+------------+
| max(score) |
+------------+
|         90 |
+------------+
1 row in set

 

MIN函数

MIN 函数返回一列中的最小值。NULL 值不包括在计算中。

mysql> select min(score) from student_course;
+------------+
| min(score) |
+------------+
|         10 |
+------------+
1 row in set

mysql>

 

AVG函数

AVG 函数返回数值列的平均值。NULL 值不包括在计算中。

mysql> select avg(score) from student_course where sid = '01';
+------------+
| avg(score) |
+------------+
|         50 |
+------------+
1 row in set

mysql>

 

GROUP BY子句

根据一个或多个列对结果集进行分组

先看下面这个使用GROUP BY的例子

mysql> select * from student_course;
+-----+------+-------+
| sid | cid  | score |
+-----+------+-------+
| 01  | 1234 |    10 |
| 01  | 1235 |    90 |
| 02  | 1234 |    70 |
| 02  | 1235 |    90 |
+-----+------+-------+
4 rows in set

mysql> select * from student_course group by sid;
+-----+------+-------+
| sid | cid  | score |
+-----+------+-------+
| 01  | 1234 |    10 |
| 02  | 1234 |    70 |
+-----+------+-------+
2 rows in set

 

group by sid分组只能分成两个组,每个组有两条数据,但是只返回了每组的第一条记录。。。

如果根据sid和cid分组就是这样的结果:

mysql> select * from student_course group by sid,cid;
+-----+------+-------+
| sid | cid  | score |
+-----+------+-------+
| 01  | 1234 |    10 |
| 01  | 1235 |    90 |
| 02  | 1234 |    70 |
| 02  | 1235 |    90 |
+-----+------+-------+
4 rows in set

mysql>

根据sid和cid分成了四组,返回每组的第一条记录(虽然每组就是一条记录)。。。。

 

GROUP BY和聚合函数结合使用

mysql> select * from student_course;
+-----+------+-------+
| sid | cid  | score |
+-----+------+-------+
| 01  | 1234 |    10 |
| 01  | 1235 |    90 |
| 02  | 1234 |    70 |
| 02  | 1235 |    90 |
+-----+------+-------+
4 rows in set

mysql>

 

查询学生学号以及其所有课程的平均成绩

mysql> select sid,avg(score) from student_course group by sid;
+-----+------------+
| sid | avg(score) |
+-----+------------+
| 01  |         50 |
| 02  |         80 |
+-----+------------+
2 rows in set

mysql>

根据上表,我们知道有两个学生,其所有课程的平均成绩分别为50,80;

查询学生学号,姓名,以及其所选课程的平均成绩

mysql> select a.sid,a.sname,avg(b.score)
    -> from student a,student_course b
    -> where a.sid = b.sid
    -> group by a.sid , a.sname
    -> ;
+-----+-------+--------------+
| sid | sname | avg(b.score) |
+-----+-------+--------------+
| 01  | 赵一  |           50 |
| 02  | 赵二  |           80 |
+-----+-------+--------------+
2 rows in set

 

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

where在分组之前过滤数据,然后根据group by指定的列进行分组,然后根据having条件过滤分组。having条件中可能包含聚合函数。。

 

查询学生学号,姓名,以及其所选课程的平均成绩另一种查询方式

mysql> select a.sid,a.sname,avg(b.score) from student a left join student_course b on a.sid = b.sid
    -> group by a.sid,a.sname;
+-----+-------+--------------+
| sid | sname | avg(b.score) |
+-----+-------+--------------+
| 01  | 赵一  |           50 |
| 02  | 赵二  |           80 |
| 03  | 赵三  | NULL         |
| 04  | 赵四  | NULL         |
+-----+-------+--------------+
4 rows in set

mysql>

=====END=====

转载于:https://my.oschina.net/xinxingegeya/blog/313245

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中的GROUP BY语句用于将结果按照一个或多个列进行分组,并对每个组应用聚合函数聚合函数对每个组的数据进行计算,并返回一个单一的结果。在 GROUP BY 子句中,您可以列出要用于分组的列,然后在SELECT语句中使用聚合函数来计算每个组的结果。 在引用提供的SQL语句中,使用了SUM(day_growth)来计算每个组中day_growth列的总和,同时使用GROUP BY create_time将结果按create_time进行分组,再使用ORDER BY create_time DESC对结果按create_time降序排序。这样,您将获得按照create_time分组并计算每个组的day_growth总和的结果。 而在引用和引用提供的SQL语句中,没有正确使用聚合函数GROUP BY子句。在MySQL中,如果SELECT语句中包含了GROUP BY子句,那么除了聚合函数之外的列必须在GROUP BY子句中列出。否则,将会报错。 所以,引用中的错误提示是因为day_growth列既没有出现在GROUP BY子句中,也没有使用聚合函数进行计算。而引用中的SQL语句虽然使用了GROUP BY子句,但是没有使用任何聚合函数,这也是不正确的使用方式。 综上所述,正确的做法是在GROUP BY子句中列出要用于分组的列,并使用聚合函数对其他列进行计算。如需按照create_time分组并计算day_growth的总和,可以使用类似于引用中的SQL语句。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL笔记-group by和聚合函数的使用](https://blog.csdn.net/qq78442761/article/details/123626662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值