SQL 使用GROUP BY 子句选择多个(非聚合函数)列

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函数计算相应的工资。

SELECT department, AVG(salary), MAX(salary), MIN(salary)
FROM employees
GROUP BY department;
SQL

执行上述查询后,我们将获得以下结果:

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子句中进行分组。

SELECT department, name, salary
FROM employees
GROUP BY department;
SQL

如果我们真的需要选择这样的非聚合函数列,我们可以通过子查询或使用窗口函数等其他技术来实现。

子查询

通过使用子查询,我们可以选择多个非聚合函数列,而不受限制。通过在子查询中选择所有需要的列,并将结果与需要进行分组的主查询中的列连接,我们可以实现这一目标。

以下是一个使用子查询来选择部门、员工姓名和工资的示例查询:

SELECT e.department, e.name, e.salary
FROM employees e
INNER JOIN (
  SELECT department, MAX(salary) AS max_salary
  FROM employees
  GROUP BY department
) max_salaries ON e.department = max_salaries.department AND e.salary = max_salaries.max_salary;
SQL

上述查询将为每个部门选择一个具有最高工资的员工。通过将子查询与主查询中的列相关联,在子查询中选择非聚合函数列,我们可以绕过限制并显示额外的信息。

总结

在本文中,我们介绍了如何使用GROUP BY子句选择多个非聚合函数列。通过在SELECT语句中使用GROUP BY子句,我们可以对结果集进行分组并应用聚合函数。尽管在GROUP BY子句中只能选择聚合函数列和分组列,但我们可以使用子查询或其他技术来选择其他的非聚合函数列。这样,我们可以获得更详细的分组数据,以展示更多的信息。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程