Sql 分组是如何工作的?

Sql 分组是如何工作的?,sql,oracle,Sql,Oracle,假设我有一个带有属性的表Tab1,a2。。。等等。所有属性都不是唯一的 以下查询的性质是什么?它总是返回一行吗 SELECT a1, a2, sum(a3) FROM Tab1 GROUP BY a1, a2 groupby为groupby子句中每个字段的唯一组合返回一行。要确保只有一行,必须使用聚合函数-COUNT、SUM、MAX,而不使用GROUP BY子句。GROUP BY为GROUP BY字段的每个唯一组合返回一行。因此,在您的示例中,(a1,a2)在Tab1的行中出现的每个不同组合都

假设我有一个带有属性的表
Tab1
a2
。。。等等。所有属性都不是唯一的

以下查询的性质是什么?它总是返回一行吗

SELECT a1, a2, sum(a3) FROM Tab1 GROUP BY a1, a2

groupby
groupby
子句中每个字段的唯一组合返回一行。要确保只有一行,必须使用聚合函数-
COUNT
SUM
MAX
,而不使用
GROUP BY
子句。

GROUP BY
GROUP BY
字段的每个唯一组合返回一行。因此,在您的示例中,
(a1,a2)
Tab1
的行中出现的每个不同组合都会导致查询中的一行,该行表示具有给定分组字段值组合的行组。聚合函数(如
SUM()
)在每个组的成员上进行计算。

按组对所有相同的记录进行分组

SELECT COUNT(ItemID), City
FROM Orders
GROUP BY City;

----------------------------------------
13  Sacrmento
23  Dallas
87  Los Angeles
5   Phoenix

如果不按
城市
分组,它只会以类似方式显示
ItemID

的总计数,而不是从技术上讲,为了记住其逻辑,可以认为每个分组字段(具有一些行)都放在不同的表中,然后聚合函数分别执行这些表


明显地陈述了下面的说法

groupby
子句指示DBMS对数据进行分组,然后 对每组执行,而不是对整个结果执行 设定

除了聚合计算语句外,
SELECT
语句中的每一列都必须出现在
GROUP BY
子句中

GROUP BY
子句必须位于任何
WHERE
子句之后和任何
ORDER BY
子句之前

我的理解让人想起他的话如下

不同的
关键字一样,通过
groupby
指定的每个字段都是 在一天结束时被认为是分组的,并且是独一无二的。这个 聚合函数在每个组上执行,如中所述


它将为a1和a2的每个唯一组合(或组)返回一行。如果只有一个唯一的组合,您只能得到一行。总和将告诉您每个组中有多少行结束=)
除了聚合计算语句之外,SELECT语句中的每一列都必须出现在group BY子句中。
相反的说法是否更接近事实?我认为
groupby
语句中的每一列都应该在
SELECT
?@Yuras中聚合。没错,SELECT中的字段必须在groupby中,但反之亦然。请浏览以下链接,以及