人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

MySQL中order by的使用詳情

發(fā)布日期:2021-12-09 17:07 | 文章來(lái)源:腳本之家

1、簡(jiǎn)介

在使用select語(yǔ)句時(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è)列排序

我們首先來(lái)看使用order by對(duì)單個(gè)列進(jìn)行排序。

需求:

根據(jù)用戶年齡進(jìn)行升序排序。

語(yǔ)句:

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í)MySQLorder by后跟的列不一定要查詢出來(lái),比如 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ù)用戶年齡升序排序之后再更加用戶名稱排序。

語(yǔ)句:

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)行排序。不過(guò)MySQL對(duì)于中文的排序需要考慮數(shù)據(jù)庫(kù)字符集編碼的問(wèn)題,如果不是很懂建議不要對(duì)中文進(jìn)行排序,因?yàn)榇蠖鄶?shù)情況我們需要得到的是拼音的排序結(jié)果,但是往往不盡人意哦!此外這里我們?cè)赼ge和name后都是沒(méi)有跟排序方式的,所以默認(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 -> 降序排序

注意: 在上面說(shuō)了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è)用戶??梢钥吹嚼钏耐?8歲了,比較老了,屬于年齡最大的人之一。

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)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部