SQL语句中聚合函数和Group By一同使用时能取到符合条件的记录中哪些列的信息

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

猜你喜欢

转载自blog.csdn.net/jdfk423/article/details/78440183