MySQL中的排序(ORDER BY)
當使用 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)