1. 程式人生 > >【mysql】-- mysql中MAX()和MIN()函式的使用之字串大小的比較

【mysql】-- mysql中MAX()和MIN()函式的使用之字串大小的比較

  在維護別人的程式碼時,需求是對課程成績進行統計分析,並以柱狀圖的形式展現出來,需要表明該科成績的最高分和最低分。遇到一個問題就是,查出的結果很明顯不是最高和最低分。
  使用的函式是MAX()和MIN(),部分sql語句和結果顯示為:
這裡寫圖片描述
  結果明顯不對,而且通過自己驗證,最高分為74.4 最低分為8.6
  無論如何都不應該是圖中所示的結果。
  一開始懷疑MAX(),MIN()函式使用不當造成的。於是查詢該函式的用法。發現數字最大最小值的判斷確實就這麼寫並沒有問題,而且之前判斷分數或者其他數字的最大最小值時也這麼寫的。不明所以。之後檢視該欄位(成績)的資料型別是VARCHAR型別的,才發現比較時不能單純使用MAX()和MIN()來比較字串的大小。所以結果才會出錯。雖然不知道為什麼他們設計成VARCHAR型別的,但是最後進行成績比較肯定比較的數值。
  
  發現問題:


mysql字串大小比較:使用MAX()查詢一個字串型別的欄位時,字串型別大小比較是先比較首字元的ASCII碼的大小,然後依次往後進行比較的。

  解決方案:

  • MAX(total_score + 0)
  • MAX(CAST(total_score as decimal(4,2))) as highScore 將字串轉換為decimal
      結果一樣:

這裡寫圖片描述
這裡寫圖片描述

補充說明:
  對字元型資料的最大值,是按照首字母由A~Z的順序排列,越往後,其值越大。當然,對於漢字則是按照其全拼拼音排列的,若首字元相同,則比較下一個字元,以此類推。
  當然,對與日期時間型別的資料也可以求其最大/最小值,其大小排列就是日期時間的早晚,越早認為其值越小,