在mysql中使用order by對多字段進行排序


工作中需用到order by 后兩個字段排序,但結果卻產生了一個Bug,以此備錄。

【1】復現問題場景

為了說明問題,模擬示例數據庫表students,效果同實例。

如下語句Sql_1:

1 SELECT * FROM students st ORDER BY st.sAge, st.sGrade DESC;

(1)預期結果:

sAge和sGrade兩個字段都按降序排列

(2)實際結果:

sAge按升序排序,sGrade按降序排列

(3)分析原因:

order by 多個字段時,Sql語法理解錯誤導致查詢結果集與期望不符。

【2】默認升序

MySql中,order by 默認是按升序排列的。

示例語句Sql_2:

1 SELECT * FROM students st ORDER BY st.sAge;

查詢結果集:

顯然,不寫排序方式,默認是升序。

【3】多個字段時,各自定義升降序

MySql中,order by 多個字段時,需要各自分別定義升降序。

當然,正是本文開始處沒有按此語法寫Sql語句造成Bug的原因。

示例語句Sql_3:

1 SELECT * FROM students st ORDER BY st.sAge DESC, st.sGrade DESC;

查詢結果集:

顯然,Sql_1想要實現Sql_3的結果是錯誤的。因為不寫排序方式默認是升序。

【4】多個字段時,按先后順序排優先級

MySql中,order by 多個字段時,按字段先后順序排優先級。

以上的示例中,我們只使用了兩個字段,下面使用三個字段驗證一下這個規則。

(1)按sAge升序、sGrade降序、sStuId降序查詢

示例語句Sql_4:

1 SELECT * FROM students st ORDER BY st.sAge ASC, st.sGrade DESC, st.sStuId DESC;

查詢結果集:

顯然,前兩個字段排列順序確定后,sStuId值沒有按降序排列

(2)按sAge升序、sStuId降序、sGrade降序查詢

示例語句Sql_5:

1 SELECT * FROM students st ORDER BY st.sAge ASC, st.sStuId DESC, st.sGrade DESC;

查詢結果集:

顯然,前兩個字段排列順序確定后,sGrade值沒有按降序排列

比較Sql_4與Sql_5語句的區別,再對比查詢結果集,慢慢體會這兩個差異點。

【5】總結

(1)在MySql中,使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列。

(2)尤其非常特別重要:默認按升序(ASC)排列。

(3)order by 后可加2個(或多個)字段,字段之間用英文逗號隔開。

(4)若A用升序,B用降序,SQL該這樣寫:order by A ASC, B DESC; 默認同理,也可以這樣寫:order by A, B DESC;

(5)若A、B都用降序,必須用兩個DESC,order by A DESC, B DESC;

(6)多個字段時,優先級按先后順序而定。

 

內容來源:https://www.cnblogs.com/Braveliu/p/10654091.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM