我在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代码时我不必重复自己。在什么情况下我们不希望它自动解决这个问题,或者它无法自动解决这个问题?
答案 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的工作原理是因为SELECT
和GROUP 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