Mysql排序

Mysql排序教程

我们介绍过 sql 查询,它查询到的结果就是数据在 mysql 数据库里面存储的结果,一般就是数据入库时候的顺序。如果数据被删除或者修改过,那么它的底层的数据存储顺序会被 DBMS 重回收存储空间的方式的影响。

那么我们是不是可以按照自己的意志让查询出来的结果按照一定的条件排序呢?答案是肯定的,我们可以使用 order by 关键词来控制查询到的结果。

本章节,我们用 student 表来做例子。建表 sql 和插入的语句 sql 如下:

CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `stu_no` int(11) DEFAULT NULL, `stu_name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 插入语句 INSERT INTO student (`id`,`stu_no`,`stu_name`,`age`) VALUES (1,1001,'小明',17), (2,1002,'小红',16), (3,1003,'小军',18), (4,1004,'小亮',19), (5,1005,'小亮',19), (6,1006,'小杰',16), (7,1007,'小亮',20);

排序详解

语法

select 列名1,列名2... from 表名 order by 列名1,列名2...

描述

关键字 描述
order by 排序的关键字

从语法中我们可以看到,order by 用在查询语句中,它放在查询语句的最后。order by 后面可以跟一列或者多个列的名字。

案例

单列排序

-- 嗨客网(www.haicoer.net) SELECT * FROM student ORDER BY age;

运行结果如下

07 order by.png

我们根据一列,age 进行排序,发现最后按照 age 进行升序将结果输出。

多列排序

-- 嗨客网(www.haicoer.net) SELECT * FROM student ORDER BY stu_name,age;

运行结果如下

08 order by 多列.png

多列在进行排序的时候,在 order by 后面追加多个列,每个列之间以 , 隔开。会先根据 order by 后面的第一个列进行升序排序,如果遇到相同的就会按照第二列进行升序排序。

按照位置排序

-- 嗨客网(www.haicoer.net) SELECT id,stu_no,stu_name,age FROM student ORDER BY 4,3;

运行结果如下

09 order by index.png

按照位置排序,是指按照 select 后面的列进行排序,注意,必须是 select 后面指定的列,而不是该表里面有多少列。这边的列是从 0 开始的,我们例子里面的 order by 4,3。表示的第四列和第三列。就是先根据年龄排序,再根据名称排序。

排序方向

从上面的例子中,我们看到查询的结果都是默认的升序的。那么我们是否可以按照自己的意愿,进行升序或者降序排列结果呢?答案是可以的,我们可以使用 ASC 或者 DESC 字段进行升序或者降序。

语法

select 列名1,列名2... from 表名 order by 列名1 [ASC/DESC],列名2 [ASC/DESC];

描述

关键字 描述
ASC 升序,默认
DESC 降序,需要标明

在 order by 的列名后面可以加 ASC 或者 DESC,大小写都可以,mysql 这边是不区分大小写的。

可以在排序的每个列后面加排序控制。排序的规则和上面描述的一样,先按照第一列进行排序,然后有相同的情况下再按照第二列排序等等。

案例

-- 嗨客网(www.haicoer.net) SELECT id,stu_no,stu_name,age FROM student ORDER BY stu_name DESC,age DESC;

运行结果如下

10 mysql 降序.png

我们可以看到,结果先按照 stu_name 进行降序,然后遇到 stu_name 相同的再按照 age 进行降序。

总结

我们如果想要对查询到到结果进行排序,可以使用 order by 关键字。后面跟列名。如果想要对结果进行自己预想排序,可以在对应的列名后面追加 ASC/DESC。ASC 表示升序,DESC 表示降序。mysql 里面默认的查询是升序。