MySQL SQL 获取聚合函数之外的其他行
在本文中,我们将介绍如何在MySQL SQL中获取聚合函数之外的其他行。在SQL中,聚合函数用于分组和汇总数据。通常,当我们使用聚合函数时,结果集只包含聚合函数的结果,而不包括其他行。但是,有时我们需要同时获取聚合函数之外的其他行,本文将介绍两种方法来实现这一目的。
阅读更多:MySQL 教程
方法一:使用子查询
子查询是一个查询语句,它嵌套在另一个查询的条件表达式或FROM语句中。使用子查询,可以在一个查询中使用另一个查询的结果。在本方法中,我们将使用子查询获取聚合函数之外的其他行。
示例
我们有一个考试成绩表,如下所示:
学生ID | 课程 | 分数 |
---|---|---|
1 | Math | 90 |
1 | Science | 80 |
2 | Math | 85 |
2 | Science | 75 |
3 | Math | 95 |
3 | Science | 85 |
我们想要获取每个学生的最高分数和科目,同时也需要获取每个学生的其他科目和分数。使用以下查询语句可以实现:
SELECT a.student_id, a.course, a.score
FROM exam a
WHERE a.score = (
SELECT MAX(b.score)
FROM exam b
WHERE b.student_id = a.student_id
)
OR a.student_id NOT IN (
SELECT c.student_id
FROM exam c
WHERE c.score = (
SELECT MAX(d.score)
FROM exam d
WHERE d.student_id = c.student_id
)
)
执行以上查询语句,我们可以得到以下结果:
学生ID | 课程 | 分数 |
---|---|---|
1 | Math | 90 |
1 | Science | 80 |
2 | Math | 85 |
2 | Science | 75 |
3 | Math | 95 |
3 | Science | 85 |
我们可以看到,结果集包含每个学生的最高分数的科目,同时也包含了每个学生的其他科目和分数。
方法二:使用HAVING子句
HAVING子句是在GROUP BY子句后面的条件表达式。它用于过滤分组后的数据。在本方法中,我们将使用HAVING子句获取聚合函数之外的其他行。
示例
我们有一个销售表,如下所示:
物品 | 销售额 |
---|---|
Book | 100 |
Book | 150 |
Pen | 50 |
Pen | 70 |
Notebook | 120 |
Notebook | 200 |
我们想要获取每种物品的总销售额,同时也需要获取销售额不达标的物品和销售额。使用以下查询语句可以实现:
SELECT a.item, SUM(a.amount) AS total_amount
FROM sales a
GROUP BY a.item
HAVING total_amount < 200
OR a.item NOT IN (
SELECT b.item
FROM sales b
GROUP BY b.item
ORDER BY SUM(b.amount) DESC
LIMIT 1
)
执行以上查询语句,我们可以得到以下结果:
物品 | 总销售额 |
---|---|
Pen | 120 |
Notebook | 320 |
我们可以看到,结果集包含了销售额不达标的物品和销售额,同时也包含每种物品的总销售额。
总结
本文介绍了两种方法在MySQL SQL中获取聚合函数之外的其他行,它们分别是使用子查询和使用HAVING子句。这两种方法都可以实现我们需要的功能,具体使用哪一种方法,取决于具体的情况和个人喜好。
使用子查询的方法可以灵活地控制需要查询的行,同时查询结果也更具可读性。但是,由于使用了子查询,查询的效率可能会比较低。
而使用HAVING子句的方法可以更加高效地获取需要的行,但是语句的结构可能更加复杂,可读性相对较低。
因此,在选择具体的方法时,需要根据具体情况和个人经验做出选择。