Essas quatro funcionalidade ( UNION ALL é um caso aparte 🙂 ) são primordiais para obter fragmentos de resultados.
Ao invés de sobrecarregar sua query com diversas condições e controles tente utilizar esses brinquedinhos.
UNION
Agrega o resultado da query subsequente a query anterior, EX:
SELECT TABLE_NAME FROM USER_TABLES UNION SELECT TABLE_NAME FROM ALL_TABLES
Ela retornará todas as tabelas do usuario e todas as tabelas do sistema, PORÉMMMMMMMMM, NÃO REPETIRÁ!!!!!!!
Se voce quiser trazer tudo, mesmo que repita, use:
SELECT TABLE_NAME FROM USER_TABLES UNION ALL SELECT TABLE_NAME FROM ALL_TABLES
A query acima trará as tabelas de USER_TABLES e também de ALL_TABLES repetindo caso seja necessário.
INTERSECT
Traz a diferença entre dois conjuntos de dados.
Digamos que voce queira os registros que existam em uma query e NECESSARIAMENTE não existam na outra. ( e vice-versa )
SELECT TABLE_NAME FROM USER_TABLES INTERSECT SELECT TABLE_NAME FROM ALL_TABLES
Isso trará todas as tabelas do usuario que nao estejam em ALL_TABLES ( que no caso é 0 pq todas as tabelas estão lá ) e também trará todas
as tabelas que tenham na ALL_TABLES e não na USER_TABLES.
Podemos resumir o INTERSECT como: Traz todos os registros que se repetem nas sentenças.
MINUS
Traz todos os registros da primeira consulta MENOS ( MINUS ) os registros da segunda consulta. ( ele também ignora os repetidos )
SELECT TABLE_NAME FROM USER_TABLES MINUS SELECT TABLE_NAME FROM ALL_TABLES
O resultado será vazio. Pois todos os registros da primeira query estão na segunda.