我正在学习 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 的查询会引发错误。
答案 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不会去猜,需要显式建立Price
和ProductName
我真的建议你阅读一些关于 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。