MySQL获取每个组中最高/最小<某些属性>的记录

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 语句:

SELECT s1.*
FROM student s1
JOIN (
  SELECT Subject, MAX(Grade) AS MaxGrade
  FROM student
  GROUP BY Subject
) s2 ON s1.Subject = s2.Subject AND s1.Grade = s2.MaxGrade;
Mysql

这个 SQL 查询的步骤如下:

  1. 使用 SELECT 语句从学生表格中选取所有列;
  2. 使用 JOIN 语句连接学生表格和一个子查询的结果,这个子查询的目的是获取每个科目中最高成绩;
  3. INNER JOIN 根据科目和成绩找到每个科目中成绩最高的学生。

这个 SQL 查询的结果是:

ID Name Age Subject Grade
2 Bob 19 Math 90
4 David 19 English 92

其中,第一行是 Math 科目中成绩最高的学生(Bob),第二行是 English 科目中成绩最高的学生(David)。

总结

MySQL 中获取每个分组中某一列最高/最小值的查询可以使用子查询的方式实现,比较灵活和通用。在实际工作中,我们可以将这种查询应用于多种场景。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册