我们介绍过 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;
运行结果如下
我们根据一列,age 进行排序,发现最后按照 age 进行升序将结果输出。
多列排序
-- 嗨客网(www.haicoer.net) SELECT * FROM student ORDER BY stu_name,age;
运行结果如下
多列在进行排序的时候,在 order by 后面追加多个列,每个列之间以
,
隔开。会先根据 order by 后面的第一个列进行升序排序,如果遇到相同的就会按照第二列进行升序排序。按照位置排序
-- 嗨客网(www.haicoer.net) SELECT id,stu_no,stu_name,age FROM student ORDER BY 4,3;
运行结果如下
按照位置排序,是指按照 select 后面的列进行排序,注意,必须是 select 后面指定的列,而不是该表里面有多少列。这边的列是从 0 开始的,我们例子里面的 order by 4,3。表示的第四列和第三列。就是先根据年龄排序,再根据名称排序。
排序方向
从上面的例子中,我们看到查询的结果都是默认的升序的。那么我们是否可以按照自己的意愿,进行升序或者降序排列结果呢?答案是可以的,我们可以使用 ASC 或者 DESC 字段进行升序或者降序。
语法