在执行查询操作时,默认情况下会按照行数据插入的先后顺序来显示行数据,但在实际应用中经常需要对数据进行排序,以显示更直观的数据,数据排序用的就是ORDER BY子句。语法如下:

SELECT <*,column [alias],...> FROM table [WHERE condition[s]] [ORDER BY] expr [ASC|DESC];

1.升序排序

默认情况下,当使用ORDER BY执行排序操作时,数据以升序方式排序,也可以在排序列后指定ASC关键字。注意:当执行升序排序时,如果被排序列包含NULL值,那么NULL会显示在最后面。如:

SQL> SELECT ename,sal FROM emp WHERE deptno=30 ORDER BY sal;

2.降序排序

为了执行降序排序,必须要指定DESC关键字。注意:当执行降序排序时,如果排序列存在NULL值,那么NULL会显示在最前面。如:

SQL> SELECT ename,sal FROM emp WHERE deptno=30 ORDER BY sal DESC;

3.使用多列排序

当使用ORDER BY子句进行排序时,不仅可以基于单个列或单个表达式进行排序,也可以基于多个列或多个表达式,当以多个列或多个表达式进行排序时,首先按照第一个列或表达式进行,当第一个列或表达式存在相同数据时,然后按第二个列或表达式进行排序。如:

SQL> SELECT ename,sal,comm FROM emp WHERE deptno=30 ORDER BY sal ASC,comm DESC;

4.使用非选择列进行排序

当使用ORDER BY 子句执行排序操作时,多数情况下选择列表都会包含被排序列,但在实际情况下,选择列表可以不包含排序列。如:

SQL> SELECT ename,job FROM emp ORDER BY sal DESC;

5.使用列别名排序

如果为列或表达式定义了别名,那么当执行排序操作时,既可以使用列或表达式进行排序,也可以使用列别名进行排序。如:

SQL> SELECT ename,sal*12 AS "全年工资" FROM emp WHERE deptno=30 ORDER BY "全年工资" DESC;

6.使用列位置编号排序

当执行排序操作时,不仅可以指定列名,列别名进行排序,也可以按照列或表达式在选择列表中的位置进行排序。如果列名或表达式名称很长,那么使用列位置排序可以缩短排序语句的长度,另外当使用UNION,NNION ALL,INTERSECT,MINUS等集合操作合并查询结果时,如果列表的列名不同,并且希望进行排序,那么必须使用列位置。如:

SQL> SELECT ename,sal*12 FROM emp WHERE deptno=20 ORDER BY 2 DESC;