sql92和99中group by的差异

208 阅读1分钟

工作中使用到了postgreSql,是一个接近sql92标准的sql,在一次sql编写中报了如下错

column “xxx” must appear in the GROUP BY clause or be used in an aggregate function

就是查询非聚合列必须出现在group by

这是sql92规定强制校验的,也确实如此,如果不强制校验,可能就会出现一些问题,使用mysqlsql99标准下比如下面这个例子。

image.png

select class,max(score),name
from test
group by class;

使用如上sql查询

image.png

可以看到name列没有出现在group by后,也没有使用聚合函数,所得出的结果和原数据不匹配,这是mysql随机选择了一个name作为了结果。

mysql中可以在sql_mode加上ONLY_FULL_GROUP_BY就能强制校验此规则

set sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

加上强制校验可以看到同样与postgreSql不能执行

image.png ​ 下面是sql92的写法

select class,max(score),name
from test
group by class,name;

但是这样查的话结果就被打散了

image.png 如果就想查询出class A中最大score的name呢,可以使用子查询

select t2.*
from (
         select class, max(score) as score
         from test
         group by class
     ) as t1
join test as t2 on t1.class = t2.class and t1.score = t2.score;