为什么这个查询需要order by才能工作?



为什么错误查询是错误的?

-- Correct
SELECT first_name, count(*)
FROM customer
GROUP BY first_name
ORDER BY count(*) DESC

-- Wrong
SELECT first_name, last_name, count(*)
FROM customer
GROUP BY first_name

来源:https://blog.jooq.org/a-beginners-guide-to-the-true-order-of-sql-operations/

我不太明白你在评论中的解释,所以在这里解释:

在第一个查询中,您选择列First_Name并将它们聚合到虚拟桶中(按First_Name分组)。第二列是一个聚合函数,计算给定桶中有多少个。例如:

First_Name, Last_Name
John, Doe
John, Carpenter
Frank, Sinatra
Frank, Doe
Frank, Short

您按First_Name进行分组(并在选择列表中选择它),您将只有行:

First_Name
John
Frank

添加一个聚合函数(在您的例子中是count),结果是(count中的*表示没有特定列的行计数):

First_Name, Count(*)
John, 2
Frank, 3

现在考虑第二个查询:

-- Wrong
SELECT first_name, last_name, count(*)
FROM customer
GROUP BY first_name

对于结果集:

First_Name, Last_Name, Count(*)
John, ????, 2
Frank, ????, 3

没有东西告诉Last_Name的内容来自哪里(因此包含它将是一个bug)。

如果你这样写:

SELECT first_name, last_name, count(*)
FROM customer
GROUP BY first_name, last_name

没关系。现在你的问题是得到比你需要的更多:

First_Name, Last_Name, Count(*)
John, Doe, 1
John, Carpenter, 1
Frank, Sinatra, 1
Frank, Doe, 1
Frank, Short, 1

这至少可以显示那些已经复制的,并且在某些情况下可能是有用的。

Issue

给定:

-- Wrong
SELECT first_name, last_name, count(*)
FROM customer
GROUP BY first_name

SQL解析器响应的错误是什么?

大致类似于:

ERROR: column "customer.last_name">必须出现在GROUP BY中子句或用于聚合函数位置:20

(运行SQL并在SQLfiddle演示中看到PostgreSQL的错误输出)

因此,请确保SELECT列表中所有未聚合的列(如countsum)都存在于GROUP BY列表中,它们构成了聚合的组。

工作组BY

-- Correct
SELECT first_name, last_name, count(*)
FROM customer
GROUP BY first_name, last_name

查看它在SQLfiddle演示中的工作结果,计算名称的重复次数。

最新更新