工作中使用到了postgreSql,是一个接近sql92标准的sql,在一次sql编写中报了如下错
column “xxx” must appear in the GROUP BY clause or be used in an aggregate function
就是查询非聚合列必须出现在group by后
这是sql92规定强制校验的,也确实如此,如果不强制校验,可能就会出现一些问题,使用mysql在sql99标准下比如下面这个例子。
select class,max(score),name
from test
group by class;
使用如上sql查询
可以看到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不能执行
下面是
sql92的写法
select class,max(score),name
from test
group by class,name;
但是这样查的话结果就被打散了
如果就想查询出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;