SQL em Oracle > DML > SELECT > Cláusula ORDER BY
Cláusula ORDER BY tl_logo2.jpg

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:

  1. Valores númericos mais baixos para os mais elevados;
  2. Datas mais antigas primeiro;
  3. Caracteres por ordem alfabética. O Oracle tem em conta os diferentes alfabetos e os respectivos caracteres acentuados;
  4. Os valores nulos aparecem em último;

A cláusula ORDER BY aceita:

  1. ASC para crescente (valor por omissão) ou DESC para decrescente;
  2. Nomes das colunas a ordenar, os seus respectivos ALIAS ou o número da ordem usada na selecção das colunas;
  3. Nomes de colunas a ordenar que não foram usadas no SELECT;
  4. Várias colunas para ordenar, umas em ASC e outras em DESC;

bthome.gifTopo


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.

bthome.gifTopo


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.

bthome.gifTopo


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.

bthome.gifTopo


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.

bthome.gifTopo


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.

bthome.gifTopo


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.

bthome.gifTopo


A utillização de ORDER BY cria os mesmos problemas de desempenho que o DISTINCT.

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-02-26