mysql order by sum_order by 、sum遇到MySQL和Oracle后

需求:统计每个班的总成绩,并按照总成绩倒序排列

表数据

89690cae4211

image.png

查询SQL

SELECT

T.grade,

SUM( T.score )

FROM

T_STU_INFO T

GROUP BY

T.grade

ORDER BY

SUM( T.score ) DESC

查询结果

89690cae4211

image.png

数据发生变化——有的学生分数为null

需求要求,为null的处理为0,

表数据

89690cae4211

image.png

SQL

SELECT

T.grade,

SUM( T.score )

FROM

T_STU_INFO T

GROUP BY

T.grade

ORDER BY

SUM( T.score ) DESC

查询结果——mySQL

89690cae4211

image.png

查询结果——Oracle

89690cae4211

image.png

出现问题

通过上述对比,我们发现:

1、sum()函数在计算过程中,如果每个值都为null,则结果为null(不为0)

2、order by排序时,如果排序的字段为null,MySQL和Oracle有不同的表现:MySQL将NULL当作是最小的数据处理,即如果倒序,值为null的放最后;而Oracle则把null当作最大的数据处理,即如果倒序排列,为null的放在最前面

由于Oracle和MySQL在排序过程中,对null的处理方式不同,因此会导致同一个系统在不同数据库下,表现形式不同,那么该怎么解决呢?

解决问题 Oracle:nvl(val,0),MySQL:IFNULL(val,0)

需求中说到,当值为null时,当作0处理,所以可以在SQL中加上判断:如果值为null,则赋值0。

经查找资料发现,在Oracle中可以用nvl()函数,而MySQL中用IFNULL()函数。优化SQL后如下:

Oracle中SQL:

···

SELECT

T.grade,

NVL(SUM(T.score), 0)

FROM

T_STU_INFO T

GROUP BY

T.grade

ORDER BY

NVL(SUM(T.score), 0) DESC

···

对应查询结果

89690cae4211

image.png

MySQL中SQL

SELECT

T.grade,

IFNULL(SUM(T.score), 0)

FROM

T_STU_INFO T

GROUP BY

T.grade

ORDER BY

IFNULL(SUM(T.score), 0) DESC

对应查询结果

89690cae4211

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值