How to use order by clause ?

在我们写SQL语句的时候,会经常用到order by子句来对查询结果进行排序。在这里对order by子句的使用,作一个简单的总结:

1 SQL语句中,order by从句永远并且一定是放在所有从句的最后位置处,也就是说,一个复杂的SQL语句中,可能会包含诸如group by子句,Where 子句等等。但是,不管有多少个从句跟在FROM关键字后面,order by从句一定是出现在所有子句的最后端,因为order by是对所有查询结果集的排序。如:

SQL> SHOW USER;
USER is "HR"
SQL> SELECT employee_id,last_name
  2  FROM employees
  3  WHERE employee_id>200
  4  ORDER BY employee_id
  5  ;
EMPLOYEE_ID LAST_NAME
----------- -------------------------
        201 Hartstein
        202 Fay
        203 Mavris
        204 Baer
        205 Higgins
        206 Gietz
6 rows selected.
SQL>

可以看到:ORDER BY 子句是出现在整个SQL语句的最后位置处。否则,ORDER BY子句不放在该SQL语句的最后,就会报错!
2  在oracle 数据库中,order by从句默认是升序(ASCend)排序的,如果想做降序排序,那么就需要显示声明关键字(DESCend).在升序排序的时候,Oracle对于NULL值的处理是放在最后的。因为Oracle认为NULL值是一个未知的,未分配的值,作为无穷大 对待,自然升序的时候就放在最后,反之,降序排列时就放在首位。如:

SQL> SELECT employee_id,last_name,manager_id
  2  FROM employees
  3  ORDER BY manager_id DESC
  4  ;
EMPLOYEE_ID LAST_NAME                 MANAGER_ID
----------- ------------------------- ----------
        100 King
        206 Gietz                            205
        202 Fay                              201
......

可以验证:查询结果集中,员工编号为100的员工是BOSS,没有manager,即其MANAGER_ID为NULL,降序排列的时候,自然会作为第一条返回记录出现在整个结果集中。
3 order by可以用于查询列表中的字段名,也可用于字段别名、表达式、字段名在列表中出现的顺序,如:

SQL> SELECT employee_id,last_name,salary*12 "Annual_Salary"
  2  FROM employees
  3  where employee_id>200
  4  order by salary*12
  5  ;
EMPLOYEE_ID LAST_NAME                 Annual_Salary
----------- ------------------------- -------------
        202 Fay                               72000
        203 Mavris                            78000
        206 Gietz                             99600
        204 Baer                             120000
        205 Higgins                          144000
        201 Hartstein                        156000
6 rows selected.

上例是按表达式排序,看一个按字段别名排序的例子:

SQL> SELECT employee_id,last_name,salary*12 Annual_Salary
  2  FROM employees
  3  WHERE employee_id>200
  4  ORDER BY Annual_Salary
  5  ;
EMPLOYEE_ID LAST_NAME                 ANNUAL_SALARY
----------- ------------------------- -------------
        202 Fay                               72000
        203 Mavris                            78000
        206 Gietz                             99600
        204 Baer                             120000
        205 Higgins                          144000
        201 Hartstein                        156000
6 rows selected.
SQL>

注:在该示例SQL语句中,如果salary*12的别名Annual_Salary,加了双引号”Annual_Salary”,那么按别名排序的时候也必须带有双引号:
order by “Annual_Salary”
接下来,再看一个按字段在查询列表中出现的先后顺序排列的例子:

SQL> SELECT employee_id,last_name,salary*12 Annual_Salary
  2  FROM employees
  3  WHERE employee_id>200
  4  ORDER BY 3;
EMPLOYEE_ID LAST_NAME                 ANNUAL_SALARY
----------- ------------------------- -------------
        202 Fay                               72000
        203 Mavris                            78000
        206 Gietz                             99600
        204 Baer                             120000
        205 Higgins                          144000
        201 Hartstein                        156000
6 rows selected.
SQL>

4 order by 子句甚至可以是对那些没有出现在查询列表中出现的字段进行排序:ORDER BY子句只对查询结果进行排序,而不关心按排序的字段是否出现在查询列表中。如:

SQL> SELECT last_name,salary*12 Annual_Salary
  2  FROM employees
  3  WHERE salary*12>150000
  4  ORDER BY employee_id
  5  ;
LAST_NAME                 ANNUAL_SALARY
------------------------- -------------
King                             288000
Kochhar                          204000
De Haan                          204000
Russell                          168000
Partners                         162000
Hartstein                        156000
6 rows selected.
SQL>
----------------------------------------------
SQL> SELECT employee_id,last_name,salary*12 Annual_Salary
  2  FROM employees
  3  WHERE salary*12>150000
  4  ORDER BY employee_id
  5  ;
EMPLOYEE_ID LAST_NAME                 ANNUAL_SALARY
----------- ------------------------- -------------
        100 King                             288000
        101 Kochhar                          204000
        102 De Haan                          204000
        145 Russell                          168000
        146 Partners                         162000
        201 Hartstein                        156000
6 rows selected.
SQL>

可以验证,其实,这两个SQL语句的排序效果是同样的!
5 ORDER BY子句中,同样支持对多个字段排序,如果需要对不同字段进行排序的方式(升序或者降序)不同,则需要显示声明。如:

SQL> SELECT employee_id,manager_id,department_id
  2  FROM employees
  3  WHERE employee_id>200
  4  ORDER BY manager_id ASC,department_id DESC
  5  ;
EMPLOYEE_ID MANAGER_ID DEPARTMENT_ID
----------- ---------- -------------
        201        100            20
        205        101           110
        204        101            70
        203        101            40
        202        201            20
        206        205           110
6 rows selected.
SQL>

ORDER BY 子句的用法很灵活,我们可以根据不同的应用场景,写出满足不同需求的排序SQL语句。

发表评论

邮箱地址不会被公开。 必填项已用*标注