SQL - select in select in query
SQL - select within select in query
在一个非常标准的问题中,选择所有商品名称及其价格高于平均价格的价格。
使用 having 的查询具有以下形式:
'''SELECT Name, Price FROM items
GROUP BY Name
HAVING Price >
(SELECT AVG(Price) FROM items )
;'''
似乎只有在 SELECT 语句中使用 AVG 时才会返回列平均值。否则,如果我使用 HAVING Price > AVG(Price)
,则不会返回任何内容。为什么需要额外的 SELECT 声明,而不是仅在价格上使用 AVG?
这就是 GROUP BY
的工作原理。在查询的 SELECT
部分,您只能拥有 GROUP BY
子句中使用的列,或聚合,如 MIN
、MAX
、AVG
, SUM
, 等等。在这种情况下,您要输出的 Price 列的总和是多少?你应该具体说明。
或者,您可以使用窗口函数计算每个名称单元的平均价格,然后添加子查询以对其进行过滤:
SELECT *
FROM (SELECT Name, Price, AVG(Price) OVER (PARTITION BY Name) AS Average_Price
FROM items) AS X
WHERE X.Price > X.Average_Price
我认为你最好的选择是 WHERE
条件下的简单子查询
select i.*
from items i
where Price > (
select avg(Price) avgPrice
from items ii
--where ii.Name = i.Name /* add this line if you need average to be calculated per Name */
)
在一个非常标准的问题中,选择所有商品名称及其价格高于平均价格的价格。 使用 having 的查询具有以下形式:
'''SELECT Name, Price FROM items
GROUP BY Name
HAVING Price >
(SELECT AVG(Price) FROM items )
;'''
似乎只有在 SELECT 语句中使用 AVG 时才会返回列平均值。否则,如果我使用 HAVING Price > AVG(Price)
,则不会返回任何内容。为什么需要额外的 SELECT 声明,而不是仅在价格上使用 AVG?
这就是 GROUP BY
的工作原理。在查询的 SELECT
部分,您只能拥有 GROUP BY
子句中使用的列,或聚合,如 MIN
、MAX
、AVG
, SUM
, 等等。在这种情况下,您要输出的 Price 列的总和是多少?你应该具体说明。
或者,您可以使用窗口函数计算每个名称单元的平均价格,然后添加子查询以对其进行过滤:
SELECT *
FROM (SELECT Name, Price, AVG(Price) OVER (PARTITION BY Name) AS Average_Price
FROM items) AS X
WHERE X.Price > X.Average_Price
我认为你最好的选择是 WHERE
条件下的简单子查询
select i.*
from items i
where Price > (
select avg(Price) avgPrice
from items ii
--where ii.Name = i.Name /* add this line if you need average to be calculated per Name */
)