Coincidindo Instruções SELECT

Os operadores de conjunto trabalham com conjuntos de dados de saída de duas ou mais instruções SELECT. Eles combinam instruções SELECT independentes de maneiras que não podem ser feitas com junções ou outros métodos convencionais no SQL. Os operadores de conjunto são ideais para uma variedade de situações em que a saída de uma instrução SELECT pode ser combinada com outros dados que não estão necessariamente relacionados a um relacionamento de chave estruturado, mas ainda podem ser combinados em um conjunto de dados de saída completo.

Uma série de instruções SELECT combinadas com operadores de conjunto pode incluir uma única cláusula ORDER BY no final da série de instruções SELECT. Os operadores de conjunto não devem ser confundidos com a palavra reservada SET que é usada com instruções SQL como UPDATE. Os operadores set não têm nada a ver com a palavra-chave SET e não usam a cláusula SET variable_name.

Existem quatro operadores de conjunto: UNION, UNION ALL, INTERSECT e MINUS. Os operadores de conjunto combinam duas ou mais instruções SELECT separadas para que sua saída seja mesclada de alguma maneira. Cada operador de conjunto mescla os dados de uma maneira diferente. Os operadores do conjunto são descritos na Tabela 1 e resumidos na Figura 1.

Operador de ConjuntoDescrição (tabela 1)
UNIONUne um conjunto de linhas. Elimina linhas duplicadas. Ordena colunas da esquerda pra direita.
UNION ALLUne um conjunto de linhas. Não elimina linhas duplicadas. Não ordena colunas da esquerda pra direita.
INTERSECTInclui somente o conjunto de linhas que estão presentes em ambas consultas. Elimina linhas duplicadas. Ordena colunas da esquerda pra direita.
MINUSRetorna apenas os dados da primeira consulta e subtrai as linhas que são idênticas na segunda consulta. Elimina linhas duplicadas. Ordena colunas da esquerda pra direita.
Figura 1

Usando a cláusula ORDER BY em operações de conjunto

O ORDER BY como já vimos serve para ordenar o resultado de uma coluna referenciando pelo nome ou posição, vejamos alguns cuidados ao usar ORDER BY quando utilizamos operadores de conjunto:

Só podemos utilizar a cláusula ORDER BY no último SELECT quando usamos operadores de conjunto tais como (UNION ALL, UNION, INTERSET e MINUS).

Devemos também ter o cuidado de que a quantidade de colunas em todos os SELECTs sejam iguais, e que o tipo de dados sejam compatíveis, como DATE e TIMESTAMP por exemplo, onde a coluna dessa combinação será TIMESTAMP.

ORDER BY – por nome ou apelido

Outra coisa a observar é que o nome ou apelido que irá retornar da consulta é referente ao nome/apelido da primeira consulta, dessa forma o ORDER BY vai utilizar o nome/apelido da primeira consulta. Veja um exemplo:

SELECT JOB_TITLE AS CARGO,
NULL AS PESSOA,
MAX_SALARY AS SALARIO_MAXIMO
FROM HR.JOBS

UNION ALL

SELECT JOBS.JOB_TITLE,
EMPLOYEES.FIRST_NAME,
EMPLOYEES.SALARY
FROM HR.EMPLOYEES
LEFT JOIN HR.JOBS ON JOBS.JOB_ID = EMPLOYEES.JOB_ID
ORDER BY CARGO, PESSOA NULLS FIRST

Vamos entender o que foi feito nessa consulta: o primeiro SELECT (linha 1 da consulta) serve para trazer as informações dos cargos que existem e o salário máximo pra cada cargo, depois temos o operador de conjunto UNION ALL (linha6) que serve para unir as linhas da primeira consulta com as linhas resultantes da segunda consulta, depois temos a segunda consulta (linha 8) que tem o propósito de trazer as pessoas, cargo e salário.

Por último temos o ORDER BY que é composto de:

  • CARGO
  • PESSOA NULLS FIRST

O CARGO é o apelido dado no primeiro SELECT, ou seja, na primeira consulta acima temos a coluna JOB_TITLE apelidada de CARGO e na segunda consulta pode ser observado acima que o JOB_TITLE não foi apelidado, o que ocorre é que somente o nome da coluna da primeira consulta que pode ser usada no ORDER BY que no caso é CARGO, da mesma forma ocorre com PESSOA, que na primeira consulta foi apelidado e na segunda consulta permanece FIRST_NAME. Não podemos nos referir a FIRST_NAME no ORDER BY pois ele não irá reconhecer, o ORDER BY só irá reconhecer nome/apelido da primeira consulta.

ORDER BY – por posição

Também podemos utilizar o ORDER BY por posição, no lugar de:
ORDER BY CARGO, PESSOA NULLS FIRST
poderíamos usar:
ORDER BY 1, 2 NULLS FIRST
que teria o mesmo efeito, o 1 representa a primeira coluna da primeira consulta e 2 se refere a segunda coluna da primeira consulta.

Observações

Um outro detalhe é a diferença entre UNION e UNION ALL. Todos os operadores, o UNION, INTERSECT e MINUS, eles ordenam o resultado em ordem crescente da esquerda para direita e removem os resultados duplicados. Menos o operador UNION ALL, em que ele nem ordena e nem remove os duplicados.

Referência

OCA Oracle Database SQL Exam Guide (Exam 1Z0-071) – páginas 564 até 566.