SQL语法 - 为什么我们需要在SQL group-by语句中列出单个字段?

时间:2016-02-12 17:37:13

标签: sql

我在SQL中使用汇总函数的理解是,select语句中不使用汇总函数的每个字段都应列在group by语句中。

select a, b, c, sum(n) as sum_of_n
from table
group by a, b, c

我的问题是,为什么我们需要列出字段?不应该以我们可以告诉group的方式实现SQL语法分析器,它可以根据select中的任何字段计算出组,并且不使用汇总函数?:

select a, b, c, sum(n) as sum_of_n
from table
group

我觉得在编写SQL代码时我不必重复自己。在什么情况下我们不希望它自动解决这个问题,或者它无法自动解决这个问题?

4 个答案:

答案 0 :(得分:2)

减少陈述中出错的可能性。明确拼写df$dim1a.dim2c.dim3b列有助于确保用户写下他们打算写的内容。您可能会对Stackoverflow上显示的帖子数量感到惊讶,其中用户正在对没有意义的列进行分组,但他们不知道为什么他们没有获得他们期望的数据。

此外,请考虑用户可能希望对列中的列进行分组而不是GROUP BY语句中实际列的情况。例如,如果我想要我的客户花费最多的钱的平均值,那么我可能会写这样的东西:

SELECT

在这种情况下,我不能简单地使用SELECT AVG(max_amt) FROM (SELECT MAX(amt) FROM Invoices GROUP BY customer_id) SQ ,我需要拼出我正在分组的列。 SQL引擎可以允许用户显式列出列,但如果未列出列,则使用默认值,但随后错误的可能性会急剧增加。

考虑它的一种方法就像强类型编程语言。让程序员明确地解决问题可以减少错误弹出的可能性,因为引擎假设程序员没有预料到。

答案 1 :(得分:0)

这是明确确定如何对记录进行分组所必需的,例如,您可以使用列进行分组但未在结果集中列出。

但是,有一个RDBMS允许不使用像MySQL这样的聚合函数来指定GROUP BY子句。

答案 2 :(得分:0)

我的第一反应就是'它是什么' =) 但是在考虑之后,TSQL的工作原理是因为SELECTGROUP BY是查询中所有操作的两个不同部分。 这可能不是最好的示例,但它确实表明您可以GROUP在不同的(更多'更多')字段上,而不是实际SELECT

SELECT brand = Convert(varchar(100), ''), model = Convert(varchar(100), ''), some_number = Convert(int, 0)
  INTO #test
 WHERE 1 = 2

INSERT #test (brand, model, some_number)
VALUES ('Ford', 'Focus', 10),
       ('Ford', 'Focus', 25),
       ('Ford', 'Kagu', 23),
       ('DMC', '12', 88)


SELECT brand, model, MAX(some_number)
  FROM #test
  GROUP BY brand, model

SELECT brand, MAX(some_number)
  FROM #test
  GROUP BY brand, model

并非所有RDBMS都是这样的,例如MySQL允许省略GROUP BY部分中SELECT的字段。从我所看到的,它然后选择一个随机值('没有隐含的第一个')并在SELECT中使用它...我想,我的关于MySQL的知识相当有限,但我在这里和那里看到了一些例子,他们总是把我弄糊涂,因为我习惯了你刚才描述的TSQL的严格要求。

答案 3 :(得分:0)

此外,您可以按照与选择

不同的顺序对列进行分组
select a, b, c, sum(d)
from table
group by c,a,b

此外,许多数据库允许您跳过列名称,您可以使用选择位置指定要包含在组中的列

select a, b, c, sum(d)
from table
group by 3,1,2