📌  相关文章
📜  postgresql 必须出现在 group by 子句中或在聚合函数中使用 - SQL (1)

📅  最后修改于: 2023-12-03 15:33:45.498000             🧑  作者: Mango

PostgreSQL 必须出现在 GROUP BY 子句中或在聚合函数中使用 - SQL

在 PostgreSQL 中,当我们使用 GROUP BY 子句对数据进行分组时,我们需要注意以下两点:

  1. GROUP BY 子句中必须出现所有未聚合的非 NULL 列,否则将会报错。

  2. 如果需要进行聚合操作,所有未聚合的列都必须要在聚合函数中使用。

这是因为在 SQL 标准中,非聚合列在分组操作时必须进行处理,而聚合函数则可以对分组后的数据进行操作。

下面我们将分别说明这两点。

必须出现在 GROUP BY 子句中

假设我们有以下的数据表:

CREATE TABLE students (
  id SERIAL PRIMARY KEY,
  name VARCHAR(50),
  age INTEGER,
  gender VARCHAR(10),
  grade INTEGER
);

我们现在想要根据年龄(age)进行分组并统计每个分组的人数,可以使用以下 SQL 语句:

SELECT age, COUNT(*) FROM students GROUP BY age;

这个 SQL 语句在 PostgreSQL 中是可以正常运行的,但是如果我们不把列名 age 添加到 GROUP BY 子句中,就会报错:

ERROR:  column "students.name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT age, name, COUNT(*) FROM students GROUP BY age;
                    ^

这是因为 name 列没有在 GROUP BY 子句中出现,也没有在聚合函数中使用,因此不能出现在 SELECT 子句中。

在聚合函数中使用

假设我们要统计每个年龄段的平均成绩,可以使用以下 SQL 语句:

SELECT age, AVG(grade) FROM students GROUP BY age;

这个 SQL 语句也是可以正常运行的,因为所有未聚合的列(age 和 grade)都在聚合函数 AVG 中使用了。

如果我们不把 grade 列添加到 AVG 函数中,也会报错:

ERROR:  column "students.grade" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT age, COUNT(*), name FROM students GROUP BY age;
                                     ^

这是因为 grade 列没有在 GROUP BY 子句中出现,也没有在聚合函数中使用,因此不能出现在 SELECT 子句中。

总结起来,无论我们是想要使用 GROUP BY 子句进行分组,还是想要使用聚合函数进行计算,都必须遵守这两个规则,否则将无法正确地处理数据。