mysql查詢語句select-order by

1 order by簡介
    ORDER BY語句用於根據指定的列對結果集進行排序,默認按照升序對結果進行排序。也可顯示指定升序(ASC)和降序(DESC)排列。如果select語句沒有order by子句,其顯示順序是不可預料的,在select語句末尾添加一個order by子句,只是保證最終結果中的行按照一定的順序排列。
    根據排序的方式不同,可以分爲按照列名排序,按照表達式排序,按照順序號碼排序,按照升序和降序排序等。對空值的排序比較特殊,mysql把空值作爲最小值對待。

2 創建測試表及數據

    2.1 創建測試表

CREATE   TABLE PENALTIES
        (PAYMENTNO      INTEGER      NOT NULL,
         PLAYERNO       INTEGER      NOT NULL,
         PAYMENT_DATE   DATE         NOT NULL,
         AMOUNT         DECIMAL(7,2) NOT NULL,
         PRIMARY KEY    (PAYMENTNO));

    注:表中記錄球員的罰款信息。

    2.2 插入測試數據

INSERT INTO PENALTIES VALUES (1,  6, '1980-12-08',100);
INSERT INTO PENALTIES VALUES (2, 44, '1981-05-05', 75);
INSERT INTO PENALTIES VALUES (3, 27, '1983-09-10',100);
INSERT INTO PENALTIES VALUES (4,104, '1984-12-08', 50);
INSERT INTO PENALTIES VALUES (5, 44, '1980-12-08', 25);
INSERT INTO PENALTIES VALUES (6,  8, '1980-12-08', 25);
INSERT INTO PENALTIES VALUES (7, 44, '1982-12-30', 30);
INSERT INTO PENALTIES VALUES (8, 27, '1984-11-12', 75);

3 order by實例分析

    3.1 按照列名排序

    3.1.1 找出每筆罰款的支付號碼和引起罰款的球員號碼,並按照球員號碼排序。

select paymentno, playerno
from penalties
order by playerno;

    注:默認排序爲升序,即小的在上面,大的在下面。

    3.1.2 如果前面一列包含重複的值,後面一列對應前面重複的值的記錄需要排序,也要用order by指定。

    例如:對每一筆罰款,獲取球員號碼和罰款數額,按照這兩列的結果進行排序。

select playerno, amount
from penalties
order by playerno, amount;

    

    3.1.3 order by子句可以包含沒有出現在select子句中的表達式。

    獲取所有罰款額,並按照球員號碼和罰款額來排序。

select amount
from penalties
order by playerno, amount;

    3.2 按照表達式排序

    除可以按照列名排序,也可按照標量表達式排序,標量表達式中也可以包含子查詢。

    例如:對於所有罰款球員,獲取所有信息(罰款單號,球員號,罰單時間,罰款額度),並按照罰單時間的年份進行排序。

mysql> select * from penalties 
order by substr(payment_date, 1, 4);


    3.3 按照順序號碼排序

    order by子句中,可以用順序號碼代替由列名或表達式組成的排序。在實際使用中儘量使用列名,避免混淆。

    例如對於3.1.1

select paymentno, playerno
from penalties
order by playerno;
    執行效果等同於
select paymentno, playerno
from penalties
order by 2;

    3.4 使用升序和降序排序

    ORDER BY語句默認按照升序對結果進行排序,也可顯示指定升序(ASC)和降序(DESC)排列

    例如:找出每筆罰款的支付號碼和引起罰款的球員號碼,並按照球員號碼降序排序。

    注:對字符的排序還取決於具體字符集和字符集校對。

    3.5 對空值排序

    排序時mysql把空值當做一列中最小值對待。

4 order by排序的實現分析

    在 MySQL 中的ORDER BY有兩種排序實現方式,一種是利用有序索引獲取有序數據,另一種則是通過相應的排序算法,將取得的數據在內存中進行排序。

    4.1 利用有序索引獲取有序數據

    利用有序索引進行排序,實際上就是當我們 Query 的 ORDER BY 條件和 Query 的執行計劃中所利用的 Index 的索引鍵(或前面幾個索引鍵)完全一致,且索引訪問方式爲 rang、 ref 或者 index 的時候,MySQL 可以利用索引順序而直接取得已經排好序的數據。這種方式的 ORDER BY 基本上可以說是最優的排序方式了,因爲 MySQL 不需要進行實際的排序操作。

    4.2 通過相應的排序算法,將取得的數據在內存中進行排序

    通過相應的排序算法,將取得的數據在內存中進行排序方式,MySQL必須要將數據在內存中進行排序,所使用的內存區域也就是我們通過 sort_buffer_size 系統變量所設置的排序區。這個排序區是每個Thread獨享的,所以說可能在同一時刻在MySQL中可能存在多個sort buffer內存區域。
    第二種方式在MySQL Query Optimizer所給出的執行計劃(通過EXPLAIN命令查看)中被稱爲filesort。在這種方式中,主要是由於沒有可以利用的有序索引取得有序的數據,MySQL只能通過將取得的數據在內存中進行排序然後再將數據返回給客戶端。在MySQL中filesort的實現算法實際上是有兩種的,一種是首先根據相應的條件取出相應的排序字段和可以直接定位行數據的行指針信息,然後在sort buffer中進行排序。另外一種是一次性取出滿足條件行的所有字段,然後在sort buffer中進行排序。

5 注意事項

    5.1 group by 比order by先執行,order by不會對group by 內部進行排序,如果group by後只有一條記錄,那麼order by 將無效。要查出group by中最大的或最小的某一字段使用 max或min函數。


****************************************************************************************
    原文地址:http://blog.csdn.net/jesseyoung/article/details/40183059
    博客主頁:http://blog.csdn.net/jesseyoung
****************************************************************************************
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章