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

这一定是打错了,对吧?没有列被赋予别名1。这意味着什么呢?我认为这一定是打错了,对吗?


它的意思是根据结果集的第一列进行分组,不管它叫什么。你可以用ORDER BY做同样的事情。

它将根据选择子句中的第一个字段进行分组

SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

在上面的查询中,groupby 1指的是select语句中的第一列 account_id。

你也可以在ORDER BY中指定。

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

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

如果根据特定的东西分组,这通常是不明智的,因为表/视图结构可能会改变。此外,如果您没有记住表字段,可能很难快速理解SQL查询在做什么。

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

它将根据放在group by子句后的列位置进行分组。

例如,如果您运行'SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' 它将根据SALESMAN_NAME进行分组。

这样做的一个风险是,如果你运行“Select *”,出于某种原因,你以不同的列顺序重新创建表,它会给你一个不同的结果。

这意味着*“在你的选择子句的第一列分组”。总是使用GROUP BY 1和ORDER BY 1。

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