GROUP BY语句中以逗号分隔的整数完成了什么?

时间:2011-06-17 00:03:27

标签: sql group-by

我有这样的查询:

SELECT col1, col2, col3, col4, col5, SUM(col6) AS total
FROM table_name
WHERE col1 < 99999
GROUP BY 1,2,3,4,5

GROUP BY声明在这里实际完成了什么?如果没有逗号分隔的整数,查询将无法正常工作。

3 个答案:

答案 0 :(得分:7)

相当于写作:

SELECT col1, col2, col3, col4, col5, SUM(col6) AS total
  FROM table_name
 WHERE col1 < 99999
 GROUP BY col1, col2, col3, col4, col5

数字是选择列表中的值/列,由列表中的序号位置表示,从1开始。

用于强制的数字;然后添加了使用选择列表中的表达式的能力。表达式可能变得难以处理,并且并非所有DBMS都允许您使用GROUP BY子句中的select-list中的“display labels”或“column aliases”,因此偶尔使用列号会很有帮助。

在您的示例中,最好使用名称 - 它们很简单。而且,通常情况下,尽可能使用名称而不是数字。

答案 1 :(得分:3)

我的猜测是,您的数据库产品允许引用Group By by position的列,而不是列名称(即第一列为1,第二列为2等)。如果是,则为专有功能,不推荐使用,因为可移植性和(可论证)可读性问题(但对于快速而肮脏的查询,可以说是非常方便)。

答案 2 :(得分:1)

MS SQL Server 2005

中尝试了相同的查询
select distinct host from some_table group by 1,2,3

错误说出

Each GROUP BY expression must contain at least one column that is not an outer reference.

所以这表明那些1,2,3只是列外引用