學生成績表
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 |
可以看到,得到的結果,是按分數由大到小的順序來進行排序的。