SQL 子句“GROUP BY 1”是啥意思?

Posted

技术标签:

【中文标题】SQL 子句“GROUP BY 1”是啥意思?【英文标题】:What does SQL clause "GROUP BY 1" mean?SQL 子句“GROUP BY 1”是什么意思? 【发布时间】:2011-11-15 14:28:51 【问题描述】:

有人向我发送了一个 SQL 查询,其中 GROUP BY 子句由以下语句组成:GROUP BY 1

这一定是笔误吧?没有为列指定别名 1。这意味着什么?我可以假设这一定是一个错字吗?

【问题讨论】:

不是错字,是结果集的第一列 请注意,此语法是不可移植的。它在 mysql 以外的数据库上的行为会有所不同。例如,在 Oracle 中,它被视为常量。 @RussellReed 是的。不幸的是(因为使用别名有时非常有帮助)ansi sql 不允许按列序号分组。原因是 group by 发生在投影之前。但是.. 当我们用数十行分组表达式时.. 我们最终会在最终的 sql 语句中得到.. mutiples 数十行。 【参考方案1】:

意思是按第一列分组,不管它叫什么。您可以对ORDER BY 执行相同操作。

【讨论】:

除非你绝对必须这样做,否则它不应该在生产代码中使用,例如。如果您正在动态选择列。这很难阅读,当有人修改 select 语句而不修复序数时,它可能会默默地导致灾难性问题。【参考方案2】:
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

在上述查询中,GROUP BY 1 指的是first column in select statement,即 account_id.

您也可以在ORDER BY中指定。

注意:ORDER BY 和 GROUP BY 中的数字总是以 1 开头,而不是 0。

【讨论】:

【参考方案3】:

除了按字段名分组外,您还可以按序号或字段在表格中的位置分组。 1 对应第一个字段(无论名称如何),2 对应第二个字段,依此类推。

如果您要对特定内容进行分组,这通常是不明智的,因为表/视图结构可能会发生变化。此外,如果您没有记住表字段,可能很难快速理解您的 SQL 查询在做什么。

如果您要返回一个唯一的集合,或者快速执行临时查找,这是一种很好的速记语法,可以减少输入。如果您计划在某个时候再次运行查询,我建议您替换它们以避免将来出现混淆和意外的并发症(由于方案更改)。

【讨论】:

+1 表示“不要这样做”,我要补充一点,避免它的最佳理由是它不可读。【参考方案4】:

它将按选择子句中的第一个字段分组

【讨论】:

【参考方案5】:

这意味着 *“按您的选择子句中的第一列分组”。始终将GROUP BY 1ORDER BY 1 一起使用。

您也可以使用GROUP BY 1,2,3..。很方便,但是需要注意那个条件;如果有人修改了您的选择列,结果可能不是您想要的结果。

【讨论】:

请详细说明为什么总是将其与 order by 结合使用?【参考方案6】:

它将按您放在 group by 子句之后的列位置进行分组。

例如,如果您运行“SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1” 它将按SALESMAN_NAME 分组。

这样做的一个风险是,如果您运行“Select *”并且由于某种原因您重新创建了具有不同顺序的列的表,它会给您带来与您预期不同的结果。

【讨论】:

以上是关于SQL 子句“GROUP BY 1”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Hive SQL子句中 group by 1 是什么意思?

这个 sql where 子句中的“&”是啥意思?

sql中=all是啥意思

双重不存在子句是啥意思?

mysql语句where条件中的是啥意思

错误无法处理 groupby 子句中的非唯一多索引是啥意思?