A consulta cria uma tabela virtual baseada em tabelas existentes ou constantes transformadas em tabelas.
{ ( Consulta ) | Consulta INTERSECT [ ALL | DISTINCT ] Consulta | Consulta EXCEPT [ ALL | DISTINCT ] Consulta | Consulta UNION [ ALL | DISTINCT ] Consulta | Express??oSele????o | VALUES Express??o }
Pode-se colocar par??nteses arbitrariamente em torno das consultas, ou utilizar par??nteses para controlar a ordem de avalia????o das opera????es INTERSECT, EXCEPT e UNION. Estas opera????es s??o avaliadas da esquerda para a direita quando n??o existem par??nteses presentes, com exce????o das opera????es INTERSECT, que s??o avaliadas antes das opera????es de UNION e EXCEPT.
As palavras chave ALL e DISTINCT determinam se as linhas duplicadas s??o eliminadas do resultado da opera????o. Se for especificada a palavra chave DISTINCT, ent??o o resultado n??o ter?? linhas duplicadas. Se for especificada a palavra chave ALL, ent??o poder??o existir linhas duplicadas no resultado, dependendo da exist??ncia de linhas duplicadas na entrada. DISTINCT ?? o padr??o, portanto se n??o for especificado nem ALL nem DISTINCT as linhas duplicadas ser??o eliminadas. Por exemplo, UNION constr??i um ResultSet intermedi??rio com todas as linhas das duas consultas, e elimina as linhas duplicadas antes de retornar as linhas remanescentes. UNION ALL retorna todas as linhas das duas consultas como resultado.
-- Uma express??o de sele????o SELECT * FROM ORG; -- uma subconsulta SELECT * FROM (SELECT COD_CLASSE FROM CLASSE_AGENDA) AS CS; -- uma subconsulta SELECT * FROM (SELECT COD_CLASSE FROM CLASSE_AGENDA) AS CS (COD_CLASSE); -- uma uni??o -- retornar todas as linhas das colunas NUM_DEP e GERENTE -- da tabela ORG -- e (1,2) e (3,4) -- NUM_DEP e GERENTE s??o colunas do tipo SMALLINT. SELECT NUM_DEP, GERENTE FROM ORG UNION ALL VALUES (1,2), (3,4); -- uma express??o de valores VALUES (1,2,3); -- Listar os n??meros dos empregados (NUM_EMP) -- de todos os empregados na tabela EMPREGADOS -- cujo n??mero do departamento (DEP_TRAB) come??a por 'E', ou -- quem est?? alocado a projetos na tabela ATIV_EMP -- cujo n??mero do projetor (NUM_PROJ) ?? igual a -- 'MA2100', 'MA2110' ou 'MA2112'. SELECT NUM_EMP FROM EMPREGADOS WHERE DEP_TRAB LIKE 'E%' UNION SELECT NUM_EMP FROM ATIV_EMP WHERE NUM_PROJ IN('MA2100', 'MA2110', 'MA2112'); -- Realizar a mesma consulta do exemplo anterior -- e "marcar" as linhas da tabela EMPREGADOS com 'emp' e -- as linhas da tabela ATIV_EMP com 'ativ_emp'. -- Diferentemente do resultado do exemplo anterior, -- esta consulta pode retornar o mesmo NUM_EMP mais de uma vez, -- identificando de que tabela veio pela "marca" associada. SELECT NUM_EMP, 'emp' FROM EMPREGADOS WHERE DEP_TRAB LIKE 'E%' UNION SELECT NUM_EMP, 'ativ_emp' FROM ATIV_EMP WHERE NUM_PROJ IN('MA2100', 'MA2110', 'MA2112'); -- Realizar a mesma consulta do exemplo anterior, -- por??m utilizando UNION ALL para que as linhas -- duplicadas n??o sejam eliminadas. SELECT NUM_EMP FROM EMPREGADOS WHERE DEP_TRAB LIKE 'E%' UNION ALL SELECT NUM_EMP FROM ATIV_EMP WHERE NUM_PROJ IN('MA2100', 'MA2110', 'MA2112'); -- Realizar a mesma consulta do exemplo anterior, -- incluindo dois empregados adicionais que no -- momento n??o se encontram em nenhuma tabela, -- e marcar estas linhas como "nova". SELECT NUM_EMP, 'emp' FROM EMPREGADOS WHERE DEP_TRAB LIKE 'E%' UNION SELECT NUM_EMP, 'ativ_emp' FROM ATIV_EMP WHERE NUM_PROJ IN('MA2100', 'MA2110', 'MA2112') UNION VALUES ('NEWAAA', 'nova'), ('NEWBBB', 'nova');