SQL标准 (SQL-92/99)规定:SELECT 列表里的所有字段,要么出现在 GROUP BY 中,要么被聚合函数(MAX/MIN/COUNT 等)包裹。
select id,max(a1) as a1,a2 from a group by id
这句话在任何非MySQL数据库里执行都是语法错。然而MySQL支持。 a2会随机取一行数据的值。当a2和id绑定都是唯一时,这种写法就很简单,但是当a2有多个值时,这个结果是不确定的,也就是今天执行和明天执行,结果可能不一样。
不知道最初MySQL开放者如何脑洞打开,放开了这个限制。而且很多早期开发人员居然也利用了这个特性,导致现在的MySQL也得支持这个特性。当然引入了ONLY_FULL_GROUP_BY参数来进行控制。
系统设计中有很多这样的案例,为了一点微不足道的灵活性,破坏了规则的完整性。个人不建议这么做。如同所有的非MySQL数据库都严格执行,只有MySQL选择了另类。