需求:统计每个班的总成绩,并按照总成绩倒序排列
表数据
image.png
查询SQL
SELECT
T.grade,
SUM( T.score )
FROM
T_STU_INFO T
GROUP BY
T.grade
ORDER BY
SUM( T.score ) DESC
查询结果
image.png
数据发生变化——有的学生分数为null
需求要求,为null的处理为0,
表数据
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
image.png
查询结果——Oracle
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
···
对应查询结果
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
对应查询结果
image.png