Tutoriais » SQL » União » Definindo:
Este comando gera uma tabela com as tuplas comuns e não comuns entre duas tabelas (que devem ser União Compatíveis).
Lembrando das tabelas depto01 e depto02 geradas no tutorial sobre o comando CREATE... na forma: CREATE temporary TABLE depto01 AS (SELECT * FROM departamentos WHERE deptosuperiorid IN ('A01','B01')); CREATE temporary TABLE depto02 AS (SELECT * FROM departamentos WHERE deptosuperiorid IN ('D01','B01'));
SELECT * FROM depto01; -- recupera 6 linhas
SELECT * FROM depto02; -- recupera 5 linhas Sintaxe: SELECT * FROM <Tabela1> UNION [ALL] (SELECT * FROM <Tabela2>);
Exemplo: SELECT * FROM depto01 UNION (SELECT * FROM depto02);
Notas:
As tabelas processados na UNIÃO DEVEM SER União Compatíveis. Recordando...
Tabelas são UC quando tem a mesma quantidade de campos e os tipos de dados e domínios de definição de cada campo correspondente também são iguais.
Note que esta definição permite que A(C1,C2,C3) seja UC com B(C3,C4,C5) DESDE que A.C1 e B.C3 sejam do mesmo tipo de dado e com a mesmo domínio de definição
e isso aconteça entre (A.C2,B.C4) e (A.C3,B.C5).
Alguns SGBDs são fracamente aderentes a este conceito, permitindo União, Subtração e Intersecção entre tabelas que simplesmente tenham a mesma quantidade campos.
Por isso é interessante 'testar' os SGBDs na execução de comandos da SQL para determinar o quanto 'aderente' o produto é ao Padrão SQL.
Na sintaxe do padrão 87 Não existia o ALL. O operador UNION exibia TODAS as linhas (mesmo as repatidas).
Isso podia ser acertado com o complemento DISTINCT escrito logo a seguir da cláusula SELECT.
Mas é claro que isso não era nada prático, e então o padrão ANSI:92 apresenta o 'ALL' e tirou a quase 'obrigatoriedade' de se escrever DISTINCT.
Teste o comando a seguir, fazendo a UNIÃO: SELECT * FROM depto01 UNION (SELECT * FROM depto02);
Deveriamos ter 11 linhas mas temos só 9. Isso acontece porque o operador UNION elimina as linhas repetidas.
Para mostrar as 11 linhas, deve-se usar o complemento ALL do operador UNION, desse modo: SELECT * FROM depto01 UNION ALL (SELECT * FROM depto02);
É possível direcionar a saída de qualquer comando da SQL para uma tabela (temporária ou não).
Criando uma tabela temporária e a seguir mostrando seu conteúdo CREATE TEMPORARY TABLE uniao01 AS (SELECT * FROM depto01 UNION (SELECT * FROM depto02)); SELECT * FROM uniao01;