为什么错误查询是错误的?
-- 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列表中所有未聚合的列(如count
或sum
)都存在于GROUP BY列表中,它们构成了聚合的组。
工作组BY
-- Correct
SELECT first_name, last_name, count(*)
FROM customer
GROUP BY first_name, last_name
查看它在SQLfiddle演示中的工作结果,计算名称的重复次数。