總結:大組在前,小組在後,計量值再最後,便可實現組內排序;下邊是參考別人的具體實例:html
工做中需用到order by 後兩個字段排序,但結果卻產生了一個Bug,以此備錄。數據庫
【1】復現問題場景3d
爲了說明問題,模擬示例數據庫表students,效果同實例。code
以下語句Sql_1:htm
1 SELECT * FROM students st ORDER BY st.sAge, st.sGrade DESC;
(1)預期結果:blog
sAge和sGrade兩個字段都按降序排列排序
(2)實際結果:get
sAge按升序排序,sGrade按降序排列class
(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)多個字段時,優先級按前後順序而定。