更多"C/C++、PostgreSQL、编译原理、计算机原理、TCP/IP、数据结构&算法、Linux编程”等技术文章请关注公众号君子黎


1.使用两个字段同时order by 排序

sql支持多个字段进行order by排序,各字段之间用逗号","隔开。如:

SELECT *FROM tablename order by column1,column2,column3 ;
如果不显示指出是升序还是降序,则默认为是升序
(1)ORDER BY column1,column2;
 表示:column1和column2都是升序

 (2)ORDER BY column1,column2 DESC;
 表示:column1 升序,column2是降序;

 (3)ORDER BY column1 DESC,column2;
 表示:column1降序,column2升序

 (4)ORDER BY column1 DESC,column2 DESC;
 表示:column1和column2都是降序。

注:想要对两个字段都同是进行升序/降序操作时候,必须得同时在每个字段
的后面加上关键字(asc/desc)。若是想要对两个关键字段按升序排序,
前面一个字段没有写关键字asc没关系,因为sql默认就是升序;但是若是
想要对两个关键字段进行降序操作,则必须得对两个关键字段都加上desc;
如: column1 desc,column2 desc;
  • 我今天就范了(4)个排序规则的错误,第一个字段没有加desc,导致最终结果不正确。后来调试了好久才找到问题的根本原因。

2.具体操作如下:

(1)select database();查看当前的数据库,show tables;查看当前数据库汇总的所有存在的表。当前 的数据库MetaData是一个空的数据库,没有表,所以创建一个新的表Emplee

这里写图片描述
(2)使用如下命令创建一个新的表Emplee;各字段和类型如下:

 create table if not exists Emplee(
        id int unsigned auto_increment,
        writetime timestamp ,
        name varchar(20),
        age int, 
        primary key(id)) character set utf8;

这里写图片描述
(3)向表Emplee中分别插入几条数据;
这里写图片描述

3.下面分别是几个不同排序查询的差异

(1)select *from Emplee;

+----+---------------------+--------+------+
| id | writetime           | name   | age  |
+----+---------------------+--------+------+
|  1 | 2018-03-27 23:17:37 | 小明   |   22 |
|  2 | 2018-03-27 23:17:49 | 小红   |   23 |
|  3 | 2018-03-27 23:17:57 | 小张   |   33 |
|  4 | 2018-03-27 23:18:05 | 小李   |   43 |
|  5 | 2018-03-27 23:18:22 | 小黑   |   13 |
|  6 | 2018-03-27 23:18:30 | 小白   |   18 |
+----+---------------------+--------+------+
6 rows in set (0.00 sec)

(2)select *from Emplee order by id desc,writetime desc;

+----+---------------------+--------+------+
| id | writetime           | name   | age  |
+----+---------------------+--------+------+
|  6 | 2018-03-27 23:18:30 | 小白   |   18 |
|  5 | 2018-03-27 23:18:22 | 小黑   |   13 |
|  4 | 2018-03-27 23:18:05 | 小李   |   43 |
|  3 | 2018-03-27 23:17:57 | 小张   |   33 |
|  2 | 2018-03-27 23:17:49 | 小红   |   23 |
|  1 | 2018-03-27 23:17:37 | 小明   |   22 |
+----+---------------------+--------+------+
6 rows in set (0.00 sec)

(3)select *from Emplee order by id , writetime asc;

+----+---------------------+--------+------+
| id | writetime           | name   | age  |
+----+---------------------+--------+------+
|  1 | 2018-03-27 23:17:37 | 小明   |   22 |
|  2 | 2018-03-27 23:17:49 | 小红   |   23 |
|  3 | 2018-03-27 23:17:57 | 小张   |   33 |
|  4 | 2018-03-27 23:18:05 | 小李   |   43 |
|  5 | 2018-03-27 23:18:22 | 小黑   |   13 |
|  6 | 2018-03-27 23:18:30 | 小白   |   18 |
+----+---------------------+--------+------+
6 rows in set (0.00 sec)

(4)select *from Emplee order by id desc,writetime asc;

+----+---------------------+--------+------+
| id | writetime           | name   | age  |
+----+---------------------+--------+------+
|  6 | 2018-03-27 23:18:30 | 小白   |   18 |
|  5 | 2018-03-27 23:18:22 | 小黑   |   13 |
|  4 | 2018-03-27 23:18:05 | 小李   |   43 |
|  3 | 2018-03-27 23:17:57 | 小张   |   33 |
|  2 | 2018-03-27 23:17:49 | 小红   |   23 |
|  1 | 2018-03-27 23:17:37 | 小明   |   22 |
+----+---------------------+--------+------+
6 rows in set (0.00 sec)

4. 更多order by的补充说明

     补充于:2020-12-23 13:23:22

     看到有读者留言关于SQL中对多个字段进行order by时,字段优先级的问题,这里做几个补充。

     (1)当order by对多个字段进行排序(升序或降序)处理时, 出现在order by后第一个字段优先。

     (2)若order by后第一个字段的值相同的记录有多条,则继续按照第二个字段的值(数值或字符ASCII)大小进行排序。比如:

SELECT A_1, B_1, C FROM table ORDER BY A_A, B_1;
       10   'A'  'C'
       /* 这里C字段不关注, 重点关注字段 A_1 和 B_1. 当A_1字段相同的有两条记录,则按照B_1字段进行排序。
       *  20  'B' 'C' 这条记录中的字段B_1要小于 20 ‘C’ 'C'这条记录中的字段B_1. 所以它先出现前面。
       */
       20   'B'  'C'   
       20   'C'  'C'

     (3)对于order by子句中的列的位置很重要, DESC/ASC的位置也同样重要,同样的记录条数,不同的字段位置,得到的效果大相庭径。