SQL语句中聚合函数和Group By一同使用时能取到符合条件的记录中哪些列的信息
聚合函数对一组值执行计算并返回单一的值。除了 COUNT 以外,聚合函数忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。但是有时候不注意聚合函数和group by 能取到哪些列信息的话,就会出错。
举个例子:如下图所示,我们现在有一个如下图所示的student表
mysql> select * from student;
+------+--------+-------+---------+
| s_id | s_name | s_age | s_class |
+------+--------+-------+---------+
| 1 | 小明 | 20 | 一班 |
| 2 | 小华 | 21 | 一班 |
| 3 | 小红 | 19 | 一班 |
| 4 | 小李 | 20 | 二班 |
| 5 | 小丽 | 21 | 二班 |
| 6 | 小米 | 18 | 二班 |
+------+--------+-------+---------+
6 rows in set
现在我们得到每个班年龄最大的同学的名字,我们先尝试如下的sql语句:
mysql> select s_name,max(s_age),s_class
-> from student
-> group by s_class;
+--------+------------+---------+
| s_name | max(s_age) | s_class |
+--------+------------+---------+
| 小明 | 21 | 一班 |
| 小李 | 21 | 二班 |
+--------+------------+---------+
2 rows in set
我们虽然正确得到了每个班的年龄最大的年龄,但是最大的年龄对应的姓名却不正确,因为我们对年龄这列使用了聚合函数,只能得到年龄这一列的数据,不能取得最大年龄对应的记录中其他的列的数据,小明这个数据是group by s_name分组后的第一条数据被填充到这里了。使用聚合函数加group by只能得到符合条件的记录中的使用过聚合函数的那一列和group by 对应的那一列,这两列的信息。就像例子中只能得到每个班级的年龄最大的这些记录中s_age和s_class这个两列的信息。
我们可以使用下面的sql语句得到正确的信息:
mysql> select s.s_name,s.s_age,s.s_class
-> from student as s,(
-> select max(s_age) as s_age,s_class
-> from student
-> group by s_class) as temp
-> where s.s_age = temp.s_age and s.s_class = temp.s_class;
+--------+-------+---------+
| s_name | s_age | s_class |
+--------+-------+---------+
| 小华 | 21 | 一班 |
| 小丽 | 21 | 二班 |
+--------+-------+---------+
2 rows in set