是否真的有必要在SQL标准中使用GROUP BY

时间:2017-09-19 18:08:10

标签: sql ansi-sql sql-standards

在编写SQL几年之后,我发现将SELECT感兴趣的列放在GROUP BY然后再次在SELECT中再次指定它通常很烦人。我不能帮助思考,为什么我们必须这样做?

用户必须具体说明要分组的列的原因是什么?如果CASE WHEN中有一个聚合函数,其他非聚合列分组,那么我们不能让SQL引擎假设吗?

如果SELECT中有一个较大的{{1}},这将特别有用且更简洁。

2 个答案:

答案 0 :(得分:5)

因为它们可能并不总是完全匹配。

例如,如果我想查找每个类别的最大书籍数量,我可以这样做:

select max(cnt)
from (
    select count(*) as cnt
    from books
    group by category
    ) t;

在某些数据库(如Oracle)中,您甚至可以这样做:

select max(count(*))
from books
group by category;

我不需要指定类别列,因为我不需要它。

Postgres等一些数据库支持在group by子句中使用别名。

答案 1 :(得分:2)

我碰巧赞同你。如果有人想要更深奥的System.out.print(j + " ") - 比如说,遗漏列 - 那么他们可以使用子查询。

如果我不得不猜测,SQL的编写者不想在聚合函数中灌输如此强大的功能。您的建议意味着group by中的函数正在确定结果集中行的定义。通常,select只会确定列。也就是说,查询失败语法是一回事,因为包含的聚合没有selectgroup by中的函数更改要输出的行是另一回事。

您可以将窗口功能与select一起使用。虽然我不推荐使用语法,但您可以这样做:

select distinct

嗯,这消除了select distinct x, count(*) over (partition by x) from t; ,但你仍然需要在每个窗口函数中重复分组标准。