Aar*_* Fi 59 mysql sql standards-compliance ansi-sql
惊喜 - 这是MySQL中完全有效的查询:
select X, Y from someTable group by X
Run Code Online (Sandbox Code Playgroud)
如果您在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.
Run Code Online (Sandbox Code Playgroud)
那么MySQL如何确定每个X显示哪个Y?它只选了一个.据我所知,它只是挑选它找到的第一个Y. 理由是,如果Y既不是聚合函数也不是group by子句,那么在查询中指定"select 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的理由是什么?
Ceb*_*yre 20
我认为这是为了处理一个字段的分组意味着其他字段也被分组的情况:
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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,user.name将始终是每个user.id唯一的,因此在GROUP BY
子句中不需要user.name是方便的(尽管如你所说,有明确的问题范围)
归档时间: |
|
查看次数: |
22955 次 |
最近记录: |