只是好奇为什么我真的必须指定group by子句,因为如果我使用一个需要group by子句的函数(不能记住这些函数的通用名称),例如。 SUM()。
因为如果我使用其中一个,我必须指定不在group by子句中使用的每一列。
为什么sql不会自动分组所有不使用聚合函数的列?这似乎是多余的,因为只要我使用聚合,我就会对未使用它的所有其他列进行分组。
答案 0 :(得分:1)
可能出于同样的原因,如果您使用的是先前未声明的变量声明,C编译器将不会自动假设并插入变量声明。有些编程语言可以做到这一点,SQL不是其中之一。
另一方面, 编辑可能会意识到这一点,并至少为您自动完成功能相关的语法部分。默认情况下,Oracle SQL开发人员会在检测到您正在编写需要它的选择列列表时自动附加GROUP BY
子句。 IMO这是一个痛苦,我通常会关闭它,但它会在IDE /编辑器级别上得到它。
编辑:根据您的上一条评论,MySQL中有一个选项(不是Microsoft的T-SQL),旨在通过实现标准SQL99的可选功能T301来放宽规则。我认为这正是你所追求的:
MySQL 5.7.5及更高版本实现了对功能依赖的检测。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下是这样),MySQL拒绝查询,其中选择列表,HAVING条件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依赖于它们的非聚合列
来源:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
但在未来版本的T-SQL中找不到有关此功能状态的更多信息。唯一的参考是this,非常含糊地说T-SQL会“部分支持这个功能”。