Cláusula ORDER BY |
O resultado de uma consulta é um conjunto de linhas. Nos conjuntos a ordem dos elementos não é um factor importante. Antes de executar uma consulta o Oracle analisa vários planos de execução e escolhe aquele que se revela mais favorável em termos de esforço (I/O, CPU, etc). O critério de escolha baseia-se em valores que variam ao longo do tempo. Quando o plano de execução muda, a ordem pela qual são mostradas as linhas da consulta pode variar.
A cláusula ORDER BY é utilizada para mostrar as linhas da consulta seguindo o critério de ordenação definido pelo utilizador. A ordenação é uma operação efectuada depois das linhas da consulta terem sido seleccionadas.
A consulta a seguir mostra as linhas da tabela EMP ordenadas por ENAME:
select * from emp order by ename; |
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7876 ADAMS CLERK 7788 12-JAN-83 1100 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7839 KING PRESIDENT 17-NOV-81 5000 10 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7934 MILLER CLERK 7782 23-JAN-82 1300 10 7788 SCOTT ANALYST 7566 09-DEC-82 3000 20 7369 SMITH CLERK 7902 17-DEC-80 800 20 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 14 rows selected. |
A ordenação crescente é feita pelos seguintes critérios:
A cláusula ORDER BY aceita:
O exemplo a seguir mostra que a ordenação por omissão é crescente:
SELECT ename, job, sal*14+NVL(comm,0) from emp order by ename; |
ENAME JOB SAL*14+NVL(COMM,0) ---------- --------- ------------------ ADAMS CLERK 15400 ALLEN SALESMAN 22700 BLAKE MANAGER 39900 CLARK MANAGER 34300 FORD ANALYST 42000 JAMES CLERK 13300 JONES MANAGER 41650 KING PRESIDENT 70000 MARTIN SALESMAN 18900 MILLER CLERK 18200 SCOTT ANALYST 42000 SMITH CLERK 11200 TURNER SALESMAN 21000 WARD SALESMAN 18000 14 rows selected. |
Para ordenação decrescente usa-se DESC:
SELECT ename, job, sal*14+NVL(comm,0) from emp order by ename desc; |
ENAME JOB SAL*14+NVL(COMM,0) ---------- --------- ------------------ WARD SALESMAN 18000 TURNER SALESMAN 21000 SMITH CLERK 11200 SCOTT ANALYST 42000 MILLER CLERK 18200 MARTIN SALESMAN 18900 KING PRESIDENT 70000 JONES MANAGER 41650 JAMES CLERK 13300 FORD ANALYST 42000 CLARK MANAGER 34300 BLAKE MANAGER 39900 ALLEN SALESMAN 22700 ADAMS CLERK 15400 14 rows selected. |
No exemplo abaixo é feita uma ordenação por JOB decrescente e em caso de igualdade neste campo por ENAME crescente:
SELECT job, ename, sal*14+NVL(comm,0) from emp order by job desc, ename asc; |
JOB ENAME SAL*14+NVL(COMM,0) --------- ---------- ------------------ SALESMAN ALLEN 22700 SALESMAN MARTIN 18900 SALESMAN TURNER 21000 SALESMAN WARD 18000 PRESIDENT KING 70000 MANAGER BLAKE 39900 MANAGER CLARK 34300 MANAGER JONES 41650 CLERK ADAMS 15400 CLERK JAMES 13300 CLERK MILLER 18200 CLERK SMITH 11200 ANALYST FORD 42000 ANALYST SCOTT 42000 14 rows selected. |
O exemplo abaixo é equivalente ao anterior mas o nome das colunas foi substituido pelas respectivas posições na consulta:
SELECT job, ename, sal*14+NVL(comm,0) from emp order by 1 desc, 2 asc; |
JOB ENAME SAL*14+NVL(COMM,0) --------- ---------- ------------------ SALESMAN ALLEN 22700 SALESMAN MARTIN 18900 SALESMAN TURNER 21000 SALESMAN WARD 18000 PRESIDENT KING 70000 MANAGER BLAKE 39900 MANAGER CLARK 34300 MANAGER JONES 41650 CLERK ADAMS 15400 CLERK JAMES 13300 CLERK MILLER 18200 CLERK SMITH 11200 ANALYST FORD 42000 ANALYST SCOTT 42000 14 rows selected. |
Para ordenar pela coluna que resulta da expressão podemos usar:
SELECT job, ename, sal*14+NVL(comm,0) from emp order by sal*14+NVL(comm,0); |
JOB ENAME SAL*14+NVL(COMM,0) --------- ---------- ------------------ CLERK SMITH 11200 CLERK JAMES 13300 CLERK ADAMS 15400 SALESMAN WARD 18000 CLERK MILLER 18200 SALESMAN MARTIN 18900 SALESMAN TURNER 21000 SALESMAN ALLEN 22700 MANAGER CLARK 34300 MANAGER BLAKE 39900 MANAGER JONES 41650 ANALYST SCOTT 42000 ANALYST FORD 42000 PRESIDENT KING 70000 14 rows selected. |
SELECT job, ename, sal*14+NVL(comm,0) from emp order by 3; |
JOB ENAME SAL*14+NVL(COMM,0) --------- ---------- ------------------ CLERK SMITH 11200 CLERK JAMES 13300 CLERK ADAMS 15400 SALESMAN WARD 18000 CLERK MILLER 18200 SALESMAN MARTIN 18900 SALESMAN TURNER 21000 SALESMAN ALLEN 22700 MANAGER CLARK 34300 MANAGER BLAKE 39900 MANAGER JONES 41650 ANALYST SCOTT 42000 ANALYST FORD 42000 PRESIDENT KING 70000 14 rows selected. |
SELECT job, ename, sal*14+NVL(comm,0) as "SOMA" from emp order by "SOMA"; |
JOB ENAME SOMA --------- ---------- ---------- CLERK SMITH 11200 CLERK JAMES 13300 CLERK ADAMS 15400 SALESMAN WARD 18000 CLERK MILLER 18200 SALESMAN MARTIN 18900 SALESMAN TURNER 21000 SALESMAN ALLEN 22700 MANAGER CLARK 34300 MANAGER BLAKE 39900 MANAGER JONES 41650 ANALYST SCOTT 42000 ANALYST FORD 42000 PRESIDENT KING 70000 14 rows selected. |
Os valores nulos aparecem em último lugar nas ordenações crescentes:
SELECT job, ename, sal*14+comm as "SOMA" from emp order by "SOMA"; |
JOB ENAME SOMA --------- ---------- ---------- SALESMAN WARD 18000 SALESMAN MARTIN 18900 SALESMAN TURNER 21000 SALESMAN ALLEN 22700 CLERK SMITH MANAGER JONES CLERK JAMES CLERK MILLER ANALYST FORD CLERK ADAMS MANAGER BLAKE MANAGER CLARK ANALYST SCOTT PRESIDENT KING 14 rows selected. |
Nas ordenações decrescentes aparecem em primeiro:
SELECT job, ename, sal*14+comm as "SOMA" from emp order by "SOMA" desc |
JOB ENAME SOMA --------- ---------- ---------- CLERK SMITH MANAGER JONES MANAGER CLARK MANAGER BLAKE ANALYST SCOTT PRESIDENT KING CLERK JAMES CLERK MILLER ANALYST FORD CLERK ADAMS SALESMAN ALLEN 22700 SALESMAN TURNER 21000 SALESMAN MARTIN 18900 SALESMAN WARD 18000 14 rows selected. |
A partir da versão 8.1.6 do Oracle a ordenação pode ser feita colocando os nulos como o valor mais alto ou mais baixo, usando NULLS LAST ou NULLS FIRST:
SELECT job, ename, sal*14+comm as "SOMA" from emp order by "SOMA" nulls first; |
JOB ENAME SOMA --------- ---------- ---------- CLERK SMITH MANAGER JONES MANAGER CLARK MANAGER BLAKE ANALYST SCOTT PRESIDENT KING CLERK JAMES CLERK MILLER ANALYST FORD CLERK ADAMS SALESMAN WARD 18000 SALESMAN MARTIN 18900 SALESMAN TURNER 21000 SALESMAN ALLEN 22700 14 rows selected. |
SELECT job, ename, sal*14+comm as "SOMA" from emp order by "SOMA" nulls last; |
JOB ENAME SOMA --------- ---------- ---------- SALESMAN WARD 18000 SALESMAN MARTIN 18900 SALESMAN TURNER 21000 SALESMAN ALLEN 22700 CLERK SMITH MANAGER JONES CLERK JAMES CLERK MILLER ANALYST FORD CLERK ADAMS MANAGER BLAKE MANAGER CLARK ANALYST SCOTT PRESIDENT KING 14 rows selected. |
O facto de utilizarmos ORDER BY não obriga a colocar o campo na coluna SELECT:
SELECT job, ename from emp order by sal*14+comm; |
JOB ENAME --------- ---------- SALESMAN WARD SALESMAN MARTIN SALESMAN TURNER SALESMAN ALLEN CLERK SMITH MANAGER JONES CLERK JAMES CLERK MILLER ANALYST FORD CLERK ADAMS MANAGER BLAKE MANAGER CLARK ANALYST SCOTT PRESIDENT KING 14 rows selected. |
A utillização de ORDER BY cria os mesmos problemas de desempenho que o DISTINCT.
Realizado por Turtle Learning ®. Última alteração em 2011-02-26