MySQL获取每个组中最高/最小<某些属性>的记录
在MySQL中,我们经常需要根据一定的规则从表格中选取数据。如果我们想要在每个组中选取最高/最小值的记录,该如何应对呢?
阅读更多:MySQL 教程
分组及聚合函数
在处理这种问题之前,我们需要先了解一些术语和函数。
分组是指我们按照某一列的值将数据分成多个组,例如按照国家、城市、年份等对数据进行分组。
聚合函数是用于对一列数据进行计算并返回单一值的函数,例如求和、平均数、最大/最小值等。
MySQL 提供了一些常用的聚合函数:
- COUNT() 函数:用于计算某列中的行数,可以统计某列的非空值个数。
- AVG() 函数:计算某列所有值的平均数。
- SUM() 函数:返回某列的所有数值之和。
- MAX() 函数:返回某列的最大值。
- MIN() 函数:返回某列的最小值。
聚合函数与分组函数配合使用,可以实现按照分组后的条件计算对应的聚合值。例如,可以以国籍分组并计算每个国家的平均身高。
最高/最小值查询
在 MySQL 中,想要获取每个组中某一列的最高/最小值,可以使用子查询。
例如,我们有一张学生表格,包含以下列:
ID | Name | Age | Subject | Grade |
---|---|---|---|---|
1 | Alice | 18 | Math | 80 |
2 | Bob | 19 | Math | 90 |
3 | Charlie | 18 | English | 85 |
4 | David | 19 | English | 92 |
如果我们想要按照科目找到每个科目中成绩最高的学生,可以使用以下 SQL 语句:
这个 SQL 查询的步骤如下:
- 使用 SELECT 语句从学生表格中选取所有列;
- 使用 JOIN 语句连接学生表格和一个子查询的结果,这个子查询的目的是获取每个科目中最高成绩;
- INNER JOIN 根据科目和成绩找到每个科目中成绩最高的学生。
这个 SQL 查询的结果是:
ID | Name | Age | Subject | Grade |
---|---|---|---|---|
2 | Bob | 19 | Math | 90 |
4 | David | 19 | English | 92 |
其中,第一行是 Math 科目中成绩最高的学生(Bob),第二行是 English 科目中成绩最高的学生(David)。
总结
MySQL 中获取每个分组中某一列最高/最小值的查询可以使用子查询的方式实现,比较灵活和通用。在实际工作中,我们可以将这种查询应用于多种场景。