学生成绩表
id | name | score |
---|---|---|
1 | 小红 | 80 |
2 | 小蓝 | 50 |
3 | 马里奥 | 100 |
4 | 路易 | 150 |
这张表中,由于某些不可抗力的影响,name和score都是用的varchar类型。
这时有一个需求,需要把所有的学生按照成绩由高到低排序。正常的想法应该是这样来写:
错误的写法
select * from student order by score desc
看上去好像没什么问题,但发现得到的结果为:
id | name | score |
---|---|---|
1 | 小红 | 80 |
2 | 小蓝 | 50 |
4 | 路易 | 150 |
3 | 马里奥 | 100 |
并不是我们想要的结果,小红只有80分却排在第一位,是为什么呢。
原因也很简单,varchar类型对数字进行排序,是从第一位开始每一位依次比较来进行排序的。也就是说,四位学生第一位,最大的数字是小红的8,所以小红排在第一位,第二大的是小蓝的5,所以小蓝排第二,路易和马里奥第一位都是1,但路易第二位是5,马里奥的第二位是0,所以路易排在马里奥的前面。
正确的写法
刚解释了普通排序错误的原因,现在说一下正确的写法。
select * from student order by CONVERT(score,SIGNED) desc
这里使用了一个函数CONVERT(score,SIGNED),实现的功能是把score字段转化为int类型再进行排序,这样得到的就是正确的结果了:
id | name | score |
---|---|---|
4 | 路易 | 150 |
3 | 马里奥 | 100 |
1 | 小红 | 80 |
2 | 小蓝 | 50 |
可以看到,得到的结果,是按分数由大到小的顺序来进行排序的。