MySQL中order by的使用詳情
1、簡(jiǎn)介
在使用select
語句時(shí)可以結(jié)合order by
對(duì)查詢的數(shù)據(jù)進(jìn)行排序。如果不使用order by
默認(rèn)情況下MySQL
返回的數(shù)據(jù)集,與它在底層表中的順序相同,可能與你添加數(shù)據(jù)到表中的順序一致,也可能不一致(在你對(duì)表進(jìn)行修改、刪除等操作時(shí)MySQL
會(huì)對(duì)內(nèi)存進(jìn)行整理,此時(shí)數(shù)據(jù)的順序會(huì)發(fā)生改變)因此如果我們希望得到的數(shù)據(jù)是有順序的,就應(yīng)該明確排序方式。
2、正文
首先準(zhǔn)備一張User
表,DDL
和表數(shù)據(jù)如下所示,可以直接復(fù)制使用。
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶名', `age` int(11) NOT NULL COMMENT '年齡', `sex` smallint(6) NOT NULL COMMENT '性別', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, '李子捌', 18, 1); INSERT INTO `user` VALUES (2, '張三', 22, 1); INSERT INTO `user` VALUES (3, '李四', 38, 1); INSERT INTO `user` VALUES (4, '王五', 25, 1); INSERT INTO `user` VALUES (5, '六麻子', 13, 0); INSERT INTO `user` VALUES (6, '田七', 37, 1); INSERT INTO `user` VALUES (7, '謝禮', 18, 1); SET FOREIGN_KEY_CHECKS = 1;
數(shù)據(jù)的初始順序如下所示:
mysql> select * from user; +----+--------+-----+-----+ | id | name | age | sex | +----+--------+-----+-----+ | 1 | 李子捌 | 18 | 1 | | 2 | 張三 | 22 | 1 | | 3 | 李四 | 38 | 1 | | 4 | 王五 | 25 | 1 | | 5 | 六麻子 | 13 | 0 | | 6 | 田七 | 37 | 1 | | 7 | 謝禮 | 18 | 1 | +----+--------+-----+-----+ 7 rows in set (0.00 sec)
2.1 單個(gè)列排序
我們首先來看使用order by
對(duì)單個(gè)列進(jìn)行排序。
需求:
根據(jù)用戶年齡進(jìn)行升序排序。
語句:
select * from user order by age;
結(jié)果:
mysql> select * from user order by age; +----+--------+-----+-----+ | id | name | age | sex | +----+--------+-----+-----+ | 5 | 六麻子 | 13 | 0 | | 1 | 李子捌 | 18 | 1 | | 7 | 謝禮 | 18 | 1 | | 2 | 張三 | 22 | 1 | | 4 | 王五 | 25 | 1 | | 6 | 田七 | 37 | 1 | | 3 | 李四 | 38 | 1 | +----+--------+-----+-----+ 7 rows in set (0.00 sec)
分析:
可以看到user
表輸出順序按照age
升序排序輸出,因此可以猜測(cè)MySQL
默認(rèn)的排序方式是升序。此外我這里使用*通配符查詢所有列,并未明確指明查詢age
列;其實(shí)MySQL
的order by
后跟的列不一定要查詢出來,比如 select name from user order by age
;這樣也是一樣的效果。
2.2 多個(gè)列排序
order by
不僅可以對(duì)單個(gè)列進(jìn)行排序,它也可以對(duì)多個(gè)列進(jìn)行排序,只需要把需要排序的列依次跟在order by
之后就可以了。
在測(cè)試之前,我們先往表中添加一條年齡相等的數(shù)據(jù)
mysql> insert into user (name, age, sex) values ('李子柒', 18, 1); Query OK, 1 row affected (0.01 sec)
需求:
根據(jù)用戶年齡升序排序之后再更加用戶名稱排序。
語句:
select * from user order by age, name;
結(jié)果:
mysql> select * from user order by age, name; +----+--------+-----+-----+ | id | name | age | sex | +----+--------+-----+-----+ | 5 | 六麻子 | 13 | 0 | | 1 | 李子捌 | 18 | 1 | | 8 | 李子柒 | 18 | 1 | | 7 | 謝禮 | 18 | 1 | | 2 | 張三 | 22 | 1 | | 4 | 王五 | 25 | 1 | | 6 | 田七 | 37 | 1 | | 3 | 李四 | 38 | 1 | +----+--------+-----+-----+ 8 rows in set (0.00 sec)
分析:
order by
可以作用于多個(gè)列,MySQL
會(huì)完全根據(jù)order by
后列的順序進(jìn)行排序。不過MySQL
對(duì)于中文的排序需要考慮數(shù)據(jù)庫(kù)字符集編碼的問題,如果不是很懂建議不要對(duì)中文進(jìn)行排序,因?yàn)榇蠖鄶?shù)情況我們需要得到的是拼音的排序結(jié)果,但是往往不盡人意哦!此外這里我們?cè)赼ge和name后都是沒有跟排序方式的,所以默認(rèn)都是升序,先根據(jù)age升序排序之后再根據(jù)name升序排序。如果需要使用降序,則需要指明DESC
,比如 select id, name, age from user order by age, name desc;
。
2.3 排序的方式
order by有兩種排序方式,它們分別是:
ASC ->
升序排序(默認(rèn)排序方式)
DESC ->
降序排序
注意: 在上面說了order by對(duì)多個(gè)列進(jìn)行排序,排序方式只會(huì)作用于一個(gè)列,比如你需要對(duì)user表中的數(shù)據(jù)同時(shí)按照age和name進(jìn)行降序,就應(yīng)該兩個(gè)列都指明降序。
mysql> select * from user order by age desc, name desc; +----+--------+-----+-----+ | id | name | age | sex | +----+--------+-----+-----+ | 3 | 李四 | 38 | 1 | | 6 | 田七 | 37 | 1 | | 4 | 王五 | 25 | 1 | | 2 | 張三 | 22 | 1 | | 7 | 謝禮 | 18 | 1 | | 8 | 李子柒 | 18 | 1 | | 1 | 李子捌 | 18 | 1 | | 5 | 六麻子 | 13 | 0 | +----+--------+-----+-----+ 8 rows in set (0.00 sec)
如果你只指定age
列降序排序,name
列不指定,那么MySQL
會(huì)根據(jù)age
降序排序后,再根據(jù)name
列進(jìn)行默認(rèn)升序排序。
mysql> select * from user order by age desc, name; +----+--------+-----+-----+ | id | name | age | sex | +----+--------+-----+-----+ | 3 | 李四 | 38 | 1 | | 6 | 田七 | 37 | 1 | | 4 | 王五 | 25 | 1 | | 2 | 張三 | 22 | 1 | | 1 | 李子捌 | 18 | 1 | | 8 | 李子柒 | 18 | 1 | | 7 | 謝禮 | 18 | 1 | | 5 | 六麻子 | 13 | 0 | +----+--------+-----+-----+ 8 rows in set (0.00 sec)
可以看到李子捌、李子柒、謝禮三行數(shù)據(jù)排序方式發(fā)生了改變。
2.4 order by結(jié)合limit
order by
結(jié)合limit
可以獲取排序后的數(shù)據(jù)行記錄數(shù)量。比如我們從user表中獲取年齡最大的一個(gè)用戶。可以看到李四同志38歲了,比較老了,屬于年齡最大的人之一。
mysql> select * from user order by age desc limit 1; +----+------+-----+-----+ | id | name | age | sex | +----+------+-----+-----+ | 3 | 李四 | 38 | 1 | +----+------+-----+-----+ 1 row in set (0.00 sec)
limit
需要跟在order by
之后,如果位置不對(duì),MySQL
會(huì)拋出異常信息。
mysql> select * from user limit 1 order by age des; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by age des' at line 1
到此這篇關(guān)于MySQL中order by的使用詳情的文章就介紹到這了,更多相關(guān)MySQL中的order by使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL出現(xiàn)Waiting for table metadata lock異常
當(dāng)MySQL使用時(shí)出行Waiting for table metadata lock異常時(shí)該怎么辦呢?這篇文章就來和大家講講解決辦法,感興趣的小伙伴可以了解一下2023-04-04mysql中find_in_set函數(shù)的基本使用方法
這篇文章主要給大家介紹了關(guān)于mysql中find_in_set函數(shù)的基本使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11配置hive元數(shù)據(jù)到Mysql中的全過程記錄
這篇文章主要給的大家介紹了關(guān)于配置hive元數(shù)據(jù)到Mysql中的全過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10利用MySQL主從配置實(shí)現(xiàn)讀寫分離減輕數(shù)據(jù)庫(kù)壓力
今天小編就為大家分享一篇關(guān)于利用MySQL主從配置實(shí)現(xiàn)讀寫分離減輕數(shù)據(jù)庫(kù)壓力,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03mysql下普通用戶備份數(shù)據(jù)庫(kù)時(shí)無lock tables權(quán)限的解決方法
mysql使用普通用戶備份出現(xiàn)無lock tables權(quán)限的解決方法,需要的朋友可以參考下。2011-10-10