为什么此 SQL 查询有效,而另一个无效?

时间:2021-05-18 03:06:01

标签: sql

我正在学习 SQL,在 this tutorial 中我可以这样写:

SELECT MAX(Price) AS Price, ProductName
FROM Products;

返回我期望的内容:

Price   ProductName
263.5   Côte de Blaye

但是在 StrataScratch 上,当我尝试开始解决问题时(我目前只是看到哪些想法可以解决问题),此(以及类似的变体)会引发错误

SELECT MAX(salary) AS salary, first_name
FROM db_employee;

错误:

(psycopg2.errors.GroupingError) column "db_employee.first_name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT MAX(salary) AS salary, first_name

从概念上讲,这些对我来说似乎是相同的查询,所以我不确定为什么来自 StrataScratch 的查询会引发错误。

3 个答案:

答案 0 :(得分:0)

这里应该有一个 group by 子句,如下所示:

SELECT MAX(Price) AS Price, ProductName
FROM Products
GROUP BY ProductName

答案 1 :(得分:0)

它实际上是在告诉您原因。 MAX() 是一个聚合函数。如果查询将包含标准列,则聚合函数需要 GROUP BY 语句。

SELECT MAX(Price) as Price, ProductName
FROM Products
GROUP BY ProductName

失败是因为 SQL 不会自动知道它应该在最高价格和产品名称之间建立关系。请记住 SQL 是一种关系型数据库语言。所有数据都必须以某种方式相关。 SQL不会去猜,需要显式建立PriceProductName

之间的关系

我真的建议你阅读一些关于 SQL 调试的文章。我注意到很多新学生的调试技巧都不高,而且 SQL 调试消息实际上提供了非常丰富的信息。

答案 2 :(得分:0)

如果您想要最高价格的产品,则使用 order by 并将结果限制为一行。在标准 SQL 中,这是:

SELECT p.*
FROM Products p
ORDER BY p.price DESC
FETCH FIRST 1 ROW ONLY;

(最后一行代码通常是 LIMIT 1。)

您的第一个查询:

SELECT MAX(Price) AS Price, ProductName
FROM Products;

应该会因语法错误而失败——并且几乎在所有数据库中都会出现。为什么?因为这是一个聚合查询(因为 MAX()ProductName 未聚合且不是 GROUP BY 的一部分)。

它确实适用于(至少)两个数据库。在旧版本的 MySQL 中,您将获得 任意 ProductName。幸运的是,您可能会得到正确的答案,但这只是巧合。 MySQL 已修复此问题,因此查询应在更新的版本中返回错误(使用默认配置设置)。

SQLite 确实允许这种语法,并且实际上返回与最高价格相关的 ProductName。但是,我不建议将其作为“有效”SQL 学习,因为它仅适用于 SQLite。