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


201

有人给我发送了一个SQL查询,其中该GROUP BY子句包含以下语句:GROUP BY 1

这一定是错字吧?没有为列指定别名1.这意味着什么?我以为这一定是错字是正确的吗?


6
它不是输入错误,而是结果集的第一列
Lamak

9
请注意,此语法不可移植。它在mysql以外的数据库上的行为将有所不同。例如,在Oracle中,将其视为常量。
罗素·里德

2
@RussellReed是的。不幸的是(由于使用别名有时会很有帮助),ansi sql不允许按列序号进行分组。原因是分组依据发生在投影之前。但是然后..当我们将表达式与数十行分组时该怎么办..我们最终在最终的sql语句中获得了数十行的多个提示。
javadba

Answers:


230

这意味着无论第一列如何分组。您可以使用进行相同的操作ORDER BY


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

FROM account
GROUP BY 1;

在上面的查询中,GROUP BY 1指的first column in select statementaccount_id

您也可以在中指定ORDER BY

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


25

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

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

如果您要返回一个唯一的集合,或快速执行临时查找,那么这是减少键入的好方法。如果您打算在某个时候再次运行查询,我建议您替换掉它们,以避免将来造成混乱和意外的复杂性(由于方案更改)。


10
为“请勿执行此操作” +1,并且我补充说,避免它的最好原因是它不可读。
Yuck


5

这意味着sql在您的select子句中按第一列进行分组,我们总是将其GROUP BY 1与一起使用ORDER BY 1,除了您也可以像这样使用,这GROUP BY 1,2,3..当然对我们来说很方便,但是您需要注意的是结果可能不是您想要的想要是否有人修改了您的选择列,并且无法看到


4

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.