更多"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的位置也同样重要,同样的记录条数,不同的字段位置,得到的效果大相庭径。