SQL

SQL 知识量:22 - 44 - 129

3.2 按列位置排序><

按列位置排序- 3.2.1 -

除了指明排序的列名外,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。

使用按列位置排序的好处是不用输入列名,坏处是有可能引用错误的列而不易发现,而且如果对表结构进行了修改(例如:改变了列的顺序),忘记改变子句中相应位置的引用就会出错。最重要的是,如果查询结果中不包含排序的列,则不能使用按位置排序。

如果需要,可以同时使用列名和位置排序,即混合两种排序方法,前提是查询结果中必须包含排序的列。

排序方向- 3.2.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来明确指定升序排列,因为默认就是升序,所以同样没必要。

特别说明- 3.2.3 -

  • SQL语句是由各个子句构成的(结构化查询语言),有些子句是必需的,有些子句是可选的。在select语句中,select是必需的,from通常也是必需的,order by则是可选的,只在需要明确排序时使用。

  • 子句的顺序十分重要,不能出错,应当确保order by子句总是位于select语句的最后。

  • 与使用按列位置排序不同,使用按列名排序时,即使查询结果中不包含排序的列,也可以使用那个列来排序,即用非查询的列排序数据是完全合法的。

  • 大多数DBMS在排序时默认“A”与“a”是相同的,但是也可以通过设置DBMS来改变这种行为。