PL/SQL

PL/SQL 知识量:16 - 57 - 244

5.4 排序查询结果><

基本排序- 5.4.1 -

使用SELECT语句获得的数据一般是没有排序的(使用DISTINCT关键词除外)。为了方便阅读和使用,最好对查询结果进行一次排序。在SQL语言中,用于排序的是ORDER BY子句。

使用ORDER BY子句可以指定在SELECT语句返回的列中所使用的排序顺序。其语法格式可表示如下:

ORDER BY
{ expr | position | c_alias }
[ ASC | DESC ]
[ NULLS FIRST | NULLS LAST ]
  [, { expr | position | c_alias }
    [ ASC | DESC ]
    [ NULLS FIRST | NULLS LAST ]
  ]...

简要说明:

  • ORDER BY项:排序关键词。

  • expr项:表达式。

  • position项:表中列的位置。

  • c_alias项:别名。

  • [ ASC | DESC ]项:正序或倒序。

  • [ NULLS FIRST | NULLS LAST ]项:对空字段的处理方式。

  • 可以根据多个字段排序。

其中,表达式是用于排序的列。可以对多列进行排序,各列在ORDER BY子句中的顺序决定了排序过程中的优先级。

注意:

  • 在默认情况下,ORDER BY按升序进行排列,即默认使用的是ASC关键词。如果要按降序进行排列,则必须使用DESC关键词。

  • ORDER BY子句一定要放在所有子句的最后(无论包含多少子句)。

  • 对于时间、数值类型的字段排序,其排序规则就是按照时间的早晚、数值的大小进行的;对于字符型的字段排序,则是依照其ASCII码的先后顺序进行的。

  • 在排序时,空值(NULL)默认被看成最大的值。有关NULL值,在PL/SQL中可以设置它所在的位置。

示例:

SQL> select * from people order by age;

  ID NAME        AGE SEX    HEIGHT WEIGHT
---- ---------- ---- ------ ------ ------
   4 Susan        19 female    168     55
   1 Bob          25 male      170     70
   2 Jeff         27 male      176     82
   5 Tom          29 male      188     95
   6 Lucy         29 female    168     65
   3 Jan          32 female    166     52
   7 Tomas        32 male      166     60

7 rows selected

多列排序- 5.4.2 -

使用ORDER BY子句也可以根据两列或多列的结果进行排序,只要用逗号分隔不同的排序关键词就可以了。

SQL> select * from people order by age,height;

  ID NAME        AGE SEX    HEIGHT WEIGHT
---- ---------- ---- ------ ------ ------
   4 Susan        19 female    168     55
   1 Bob          25 male      170     70
   2 Jeff         27 male      176     82
   6 Lucy         29 female    168     65
   5 Tom          29 male      188     95
   3 Jan          32 female    166     52
   7 Tomas        32 male      166     60

7 rows selected

实际的排序结果是根据ORDER BY子句后面列名的顺序确定优先级的。

ORDER BY子句除了可以根据列名进行排序外,还支持根据列的相对位置(即序号)进行排序。

下面示例根据第3列(sex)和第5列(weight)进行排序:

SQL> select * from people order by 3,5;

  ID NAME        AGE SEX    HEIGHT WEIGHT
---- ---------- ---- ------ ------ ------
   4 Susan        19 female    168     55
   1 Bob          25 male      170     70
   2 Jeff         27 male      176     82
   6 Lucy         29 female    168     65
   5 Tom          29 male      188     95
   3 Jan          32 female    166     52
   7 Tomas        32 male      166     60

7 rows selected