1. 程式人生 > >MySQL中的排序(ORDER BY)

MySQL中的排序(ORDER BY)

primary 數據庫 所有 直接 mage pre color 應該 圖片

當使用 SELECT FROM 時,如果不排 序,數據一般將以它在底層表中出現的順序顯示。這可以是數據最初添加到表中的順序。但是,如果數據後來進行過更新或刪除,則此順 序將會受到MySQL重用回收存儲空間的影響。因此,如果不明確控 制的話,不能(也不應該)依賴該排序順序。關系數據庫設計理論認 為,如果不明確規定排序順序,則不應該假定檢索出的數據的順序有 意義。 《MySQL必知必會》

可以使用 ORDER BY 子句取一列或者多列的名字,據此對輸出進行排序,比如創建了如下的student表:

創建表:

CREATE TABLE stu
 (Cno SMALLINT,
 Sno 
CHAR(11) PRIMARY KEY, Sname CHAR(20) UNIQUE, Ssex CHAR(2), Sage SMALLINT);

插入數據:

insert into stu values(5,20162180111,蕭峰,,22);
insert into stu values(4,20162180108,張無忌,,21);
insert into stu values(3,20162180222,王語嫣,,21);
insert into stu values(5,20162180088,郭襄,,19
); insert into stu values(5,20162180067,袁紫衣,,21); insert into stu values(3,20162180023,趙敏,,20);

技術分享圖片

想依據Sno(學號)對輸出進行排序, SELECT * FROM stu ORDER BY Sno; 得到以下排序後的輸出。

技術分享圖片

但是,經常需要按不止一個列進行數據排序。比如想對上述表中的數據先進行班排序,然後在班內進行學號的排序,操作語句如下:

SELECT * FROM stu ORDER BY Cno,Sno;

技術分享圖片

但是應該註意到,這種多列一起排序的情況,以2列為例,如果第一列中的所有值都不相同,那麽第二列中的排序就沒有意義了,如,所有的人都來自不同班,那麽按班號排序後就無須再按學號排序了。

ORDER BY 默認的排序是升序的,也可以改為降序,操作語句如下:

SELECT * FROM stu ORDER BY Sno DESC;

技術分享圖片

當然,同理,想先按班級號升序排序,然後再在班內按學號降序排序的操作如下:

SELECT * FROM stu ORDER BY Cno,Sno DESC;

技術分享圖片

由此可以看到,DESC關鍵字只應用到直接位於其前面的列名。

使用ORDER BY 和 LIMIT 可以找出一個列中最高或者最低的值

比如,想找出學生中學號最高的那位同學,操作語句如下:

SELECT * FROM stu ORDER BY Sno DESC LIMIT 1;

技術分享圖片

註意:ORDER BY子句的位置 在給出ORDER BY子句時,應該保證它 位於FROM子句之後。如果使用LIMIT,它必須位於ORDER BY 之後。使用子句的次序不對將產生錯誤消息

MySQL中的排序(ORDER BY)