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 1
与ORDER 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”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章