在我们写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语句。