SQL 使用GROUP BY 子句选择多个(非聚合函数)列
在本文中,我们将介绍如何使用SQL的GROUP BY子句来选择多个非聚合函数列。GROUP BY子句用于对结果集进行分组,并使用聚合函数对每个分组进行计算。然而,有时我们需要选择额外的非聚合函数列,以展示更多的信息。
阅读更多:SQL 教程
什么是GROUP BY子句?
GROUP BY子句是SQL中用于对结果集进行分组的关键字之一。它通常与SELECT语句一起使用,用于返回经过聚合函数计算后的结果集。GROUP BY子句将相同的值归类在一起,并对每个组应用聚合函数,例如SUM、COUNT、AVG等。然而,GROUP BY子句还允许我们选择非聚合函数列,以显示每个组的详细信息。
下面我们将使用一个示例数据库来说明如何使用GROUP BY子句选择多个非聚合函数列。
示例数据库
考虑一个名为”employees”的数据库表,其中包含员工的信息,如下所示:
id | name | department | salary |
---|---|---|---|
1 | John Doe | HR | 5000 |
2 | Jane Doe | HR | 6000 |
3 | Mary Sue | Sales | 7000 |
4 | Tom Smith | Sales | 8000 |
5 | Bob Brown | IT | 5500 |
选择多个非聚合函数列
假设我们想要选择每个部门的平均工资、最高工资和最低工资,同时显示部门名称。我们可以使用GROUP BY子句将结果按部门进行分组,并使用AVG、MAX和MIN函数计算相应的工资。
执行上述查询后,我们将获得以下结果:
department | AVG(salary) | MAX(salary) | MIN(salary) |
---|---|---|---|
HR | 5500 | 6000 | 5000 |
Sales | 7500 | 8000 | 7000 |
IT | 5500 | 5500 | 5500 |
通过使用GROUP BY子句并选择多个非聚合函数列,我们可以根据部门计算平均工资、最高工资和最低工资。
谓词列的限制
在上面的示例中,我们选择了除了部门列之外的三个非聚合函数列。需要注意的是,根据SQL的语法,除了聚合函数和GROUP BY子句中的列外,我们不能选择其他的非聚合函数列。这是因为SELECT中的列必须在GROUP BY中进行分组,或者是聚合函数的一部分。
例如,如果我们想要选择部门、员工的姓名和员工的工资,我们会遇到错误。以下查询将导致错误,因为”name”列不是一个聚合函数的一部分,也没有在GROUP BY子句中进行分组。
如果我们真的需要选择这样的非聚合函数列,我们可以通过子查询或使用窗口函数等其他技术来实现。
子查询
通过使用子查询,我们可以选择多个非聚合函数列,而不受限制。通过在子查询中选择所有需要的列,并将结果与需要进行分组的主查询中的列连接,我们可以实现这一目标。
以下是一个使用子查询来选择部门、员工姓名和工资的示例查询:
上述查询将为每个部门选择一个具有最高工资的员工。通过将子查询与主查询中的列相关联,在子查询中选择非聚合函数列,我们可以绕过限制并显示额外的信息。
总结
在本文中,我们介绍了如何使用GROUP BY子句选择多个非聚合函数列。通过在SELECT语句中使用GROUP BY子句,我们可以对结果集进行分组并应用聚合函数。尽管在GROUP BY子句中只能选择聚合函数列和分组列,但我们可以使用子查询或其他技术来选择其他的非聚合函数列。这样,我们可以获得更详细的分组数据,以展示更多的信息。