惊喜-这是MySQL中完全有效的查询:
select X, Y from someTable group by X
如果您在Oracle或SQL Server中尝试了此查询,则会收到自然错误消息:
Column 'Y' is invalid in the select list because it is not contained in
either an aggregate function or the GROUP BY clause.
那么MySQL如何确定每个X显示哪个Y?它只是选择一个。据我所知,它只是选择找到的第一个Y。理由是,如果Y既不是聚合函数也不在group by子句中,则在查询中指定“选择Y”是没有道理的。因此,作为数据库引擎的我将返回我想要的任何东西,而您会喜欢它。
甚至还有一个MySQL配置参数来关闭这种“松散”状态。
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
本文甚至提到MySQL在这方面如何因不符合ANSI-SQL而受到批评。
http://www.oreillynet.com/databases/blog/2007/05/debunking_group_by_myths.html
我的问题是:为什么MySQL用这种方式设计?他们打破ANSI-SQL的理由是什么?
最佳答案
我认为这是要处理按一个字段分组意味着其他字段也要分组的情况:
SELECT user.id, user.name, COUNT(post.*) AS posts
FROM user
LEFT OUTER JOIN post ON post.owner_id=user.id
GROUP BY user.id
在这种情况下,user.name对于每个user.id始终是唯一的,因此在
GROUP BY
子句中不需要user.name会很方便(尽管您说过,问题的范围很广)关于mysql - 为什么MySQL允许 “group by”查询而没有聚合函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1225144/