Mysql 使用GROUPBY的sql嵌套查询
我正在阅读一些关于group by子句的教程,我遇到了以下问题,不知道为什么会这样解决,如下表所示: 要求是在每个类别中选择最昂贵的产品,下面的查询就是答案:Mysql 使用GROUPBY的sql嵌套查询,mysql,sql,group-by,subquery,Mysql,Sql,Group By,Subquery,我正在阅读一些关于group by子句的教程,我遇到了以下问题,不知道为什么会这样解决,如下表所示: 要求是在每个类别中选择最昂贵的产品,下面的查询就是答案: SELECT categoryID, productID, productName, MAX(unitprice) FROM products A WHERE unitprice = ( SELECT MAX(unitprice) FROM products B WHERE
SELECT
categoryID, productID, productName, MAX(unitprice)
FROM
products A
WHERE
unitprice = (
SELECT
MAX(unitprice)
FROM
products B
WHERE
B.categoryId = A.categoryID)
GROUP BY categoryID;
我不知道为什么上面的问题是答案,为什么不仅仅是:
SELECT
categoryID, productID, productName, MAX(unitprice)
FROM
products
GROUP BY categoryID;
另外,如果第一个查询是正确的,那么为什么MAX
函数存在于外部查询和内部查询中,它不足以存在于内部查询中吗?
谢谢。第二个查询将产生错误,因为在Group by子句中,select子句中的列不可能按它们分组(除非它们受聚合约束)。
因此,您需要首先找到每个类别中的最高单价,然后找到具有该单价的产品。实际上,您可以通过多种方式实现这一点。第一个查询就是其中之一 从您的图片上看,正如其他人提到的,您正在使用mysql,mysql Optimizer不太喜欢子查询,运行大量数据会很糟糕,最好的习惯是尽可能使用联接(如果您在postgres、oracle或mssql中查看查询计划,90%的时间会将子查询重新写入联接) 第二个查询将在默认mysql上运行,因为它将根据您错过的列进行分组 以下是一个例子:
SELECT
A.categoryID, A.productID, A.productName, B.max_unitprice
FROM products A
JOIN (
SELECT
max(unit price) as max_unitprice,
categoryId
FROM products
GROUP BY categoryId) B
ON B.categoryId = A.categoryID
第二个查询仅聚合categoryid,因此结果集不提供列productid和productname。第一个查询在我所知道的任何数据库中都不起作用。您是偶然使用mysql的吗?请打开mysql中的严格分组模式。或者不要使用MySQL如果你不知道你不是SQL的高手,那是很危险的。
SELECT p.*
FROM products p
WHERE NOT EXISTS ( SELECT 'p2'
FROM products p2
WHERE p2.categoryId = p.categoryId
AND p2.unitPrice > p.unitPrice
)