SQL 知识量:22 - 44 - 129
除了指明排序的列名外,order by子句还支持按照列的相对位置进行排序,列的顺序从1开始计数。
例如:查询学生表,使用按列位置排序,按照年龄和姓名进行排序。
select * from student order by 3,2;
查询结果:
+----+--------+-----+--------+ | id | name | age | sex | +----+--------+-----+--------+ | 8 | Alice | 10 | female | | 4 | Robot | 10 | male | | 6 | Toney | 10 | male | | 3 | Bob | 11 | male | | 9 | Bonnie | 11 | male | | 5 | Jen | 11 | female | | 1 | Susan | 11 | female | | 10 | Ella | 12 | female | | 2 | Jame | 12 | male | | 7 | Jack | 13 | male | +----+--------+-----+--------+
查询结果与按照列名查询的一样,age列的位置是3,name列的位置是2。
使用按列位置排序的好处是不用输入列名,坏处是有可能引用错误的列而不易发现,而且如果对表结构进行了修改(例如:改变了列的顺序),忘记改变子句中相应位置的引用就会出错。最重要的是,如果查询结果中不包含排序的列,则不能使用按位置排序。
如果需要,可以同时使用列名和位置排序,即混合两种排序方法,前提是查询结果中必须包含排序的列。
数据排序的方向分为升序和降序,数据库默认是按照升序。如果需要,可以改变默认排序方向,使用关键字进行指定。
升序的关键字是:ASC(ASCENDING)。
降序的关键字是:DESC(DESCENDING)。
例如:查询学生表,按照年龄降序排序。
select * from student order by age desc;
查询结果:
+----+--------+-----+--------+ | id | name | age | sex | +----+--------+-----+--------+ | 7 | Jack | 13 | male | | 2 | Jame | 12 | male | | 10 | Ella | 12 | female | | 1 | Susan | 11 | female | | 3 | Bob | 11 | male | | 5 | Jen | 11 | female | | 9 | Bonnie | 11 | male | | 4 | Robot | 10 | male | | 6 | Toney | 10 | male | | 8 | Alice | 10 | female | +----+--------+-----+--------+
注意:关键字DESC只应用于直接位于其前面的列名,如果想对多个列降序排列,必须对每个列都指定DESC关键字。
例如:查询学生表,分别按照年龄和姓名降序排序。
select * from student order by age desc,name desc;
查询结果:
+----+--------+-----+--------+ | id | name | age | sex | +----+--------+-----+--------+ | 7 | Jack | 13 | male | | 2 | Jame | 12 | male | | 10 | Ella | 12 | female | | 1 | Susan | 11 | female | | 5 | Jen | 11 | female | | 9 | Bonnie | 11 | male | | 3 | Bob | 11 | male | | 6 | Toney | 10 | male | | 4 | Robot | 10 | male | | 8 | Alice | 10 | female | +----+--------+-----+--------+
可以使用关键字的全称,即:ASCENDING和DESCENDING,但是没必要找麻烦。也可以使用ASC来明确指定升序排列,因为默认就是升序,所以同样没必要。
SQL语句是由各个子句构成的(结构化查询语言),有些子句是必需的,有些子句是可选的。在select语句中,select是必需的,from通常也是必需的,order by则是可选的,只在需要明确排序时使用。
子句的顺序十分重要,不能出错,应当确保order by子句总是位于select语句的最后。
与使用按列位置排序不同,使用按列名排序时,即使查询结果中不包含排序的列,也可以使用那个列来排序,即用非查询的列排序数据是完全合法的。
大多数DBMS在排序时默认“A”与“a”是相同的,但是也可以通过设置DBMS来改变这种行为。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6