gpt4 book ai didi

sql - 为什么不能在单个SELECT中混合使用Aggregate值和Non-Aggregate值?

转载 作者:行者123 更新时间:2023-12-03 12:09:04 26 4
gpt4 key购买 nike

我知道,如果SELECT语句中有一个聚合函数,则该语句中的所有其他值必须是聚合函数,或在GROUP BY子句中列出。我不明白为什么会这样。

如果我做:

SELECT Name, 'Jones' AS Surname FROM People

我得到:
NAME    SURNAME
Dave Jones
Susan Jones
Amy Jones

因此,DBMS已从每一行获取一个值,并将单个值附加到结果集中。没关系。但是,如果可行,我为什么不能:
SELECT Name, COUNT(Name) AS Surname FROM People

似乎是同一想法,从每行中获取一个值并附加一个值。但是代替:
NAME    SURNAME
Dave 3
Susan 3
Amy 3

我得到:

You tried to execute a query that does not include the specified expression 'ContactName' as part of an aggregate function.



我知道这是不允许的,但是两种情况看起来是如此相似,以至于我不明白为什么。是否使DBMS易于实现?如果有人可以向我解释为什么它不像我认为的那样起作用,我将不胜感激。

最佳答案

汇总不适用于完整的结果,它们仅适用于结果中的组。

考虑一个包含以下内容的表:

Person   Pet
-------- --------
Amy Cat
Amy Dog
Amy Canary
Dave Dog
Susan Snake
Susan Spider

如果您使用按人员分组的查询,它将把数据分为以下几组:
Amy:
Amy Cat
Amy Dog
Amy Canary
Dave:
Dave Dog
Susan:
Susan Snake
Susan Spider

如果使用聚合,例如计算总计数,则将为每个组产生一个结果:
Amy:
Amy Cat
Amy Dog
Amy Canary count(*) = 3
Dave:
Dave Dog count(*) = 1
Susan:
Susan Snake
Susan Spider count(*) = 2

因此,查询 select Person, count(*) from People group by Person为每个组提供一条记录:
Amy    3
Dave 1
Susan 2

如果您还尝试在结果中获取Pet字段,则该方法不起作用,因为每个组中该字段可能有多个值。

(某些数据库,例如MySQL,确实允许这样做,并且仅从组内返回任何随机值,并且您有责任知道结果是否合理。)

如果您使用汇总,但未指定任何分组,则查询仍将分组,并且整个结果将是一个分组。因此,查询 select count(*) from Person将创建一个包含所有记录的单个组,并且聚合可以计算该组中的记录。结果每组包含一行,并且由于只有一组,因此结果中将只有一行。

关于sql - 为什么不能在单个SELECT中混合使用Aggregate值和Non-Aggregate值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5920070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com