Resumo : neste tutorial, você aprenderá como usar UNION
o operador MySQL para combinar dois ou mais conjuntos de resultados de várias SELECT
instruções em um único conjunto de resultados.
UNION
Operador MySQL
O operador MySQL UNION
permite combinar dois ou mais conjuntos de resultados de consultas em um único conjunto de resultados. O seguinte ilustra a sintaxe do UNION
operador:
SELECT column_list
UNION [DISTINCT | ALL]
SELECT column_list
UNION [DISTINCT | ALL]
SELECT column_list
...
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Para combinar o conjunto de resultados de duas ou mais consultas usando o UNION
operador, estas são as regras básicas que você deve seguir:
- Primeiro, o número e a ordem das colunas que aparecem em todas
SELECT
as declarações devem ser iguais. - Em segundo lugar, os tipos de dados das colunas devem ser iguais ou compatíveis.
Por padrão, o UNION
operador remove linhas duplicadas mesmo que você não especifique o DISTINCT
operador explicitamente.
Vamos ver as seguintes tabelas de exemplo: t1
e t2
:
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1 (
id INT PRIMARY KEY
);
CREATE TABLE t2 (
id INT PRIMARY KEY
);
INSERT INTO t1 VALUES (1),(2),(3);
INSERT INTO t2 VALUES (2),(3),(4);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A instrução a seguir combina conjuntos de resultados retornados de t1
tabelas t2
:
SELECT id
FROM t1
UNION
SELECT id
FROM t2;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O conjunto de resultados final contém os valores distintos de conjuntos de resultados separados retornados pelas consultas:
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como as linhas com valores 2 e 3 são duplicadas, UNION
elas foram removidas e mantidas apenas valores exclusivos.
O diagrama de Venn a seguir ilustra a união de dois conjuntos de resultados provenientes de tabelas t1
e t2
:
Se você usar UNION ALL
explicitamente, as linhas duplicadas, se disponíveis, permanecerão no resultado. Como UNION ALL
não precisa lidar com duplicatas, seu desempenho é mais rápido que o UNION DISTINCT
.
SELECT id
FROM t1
UNION ALL
SELECT id
FROM t2;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 2 |
| 3 |
| 4 |
+----+
6 rows in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como você pode ver, as duplicatas aparecem no conjunto de resultados combinados devido à UNION ALL
operação.
UNION
vs.JOIN
A JOIN
combina conjuntos de resultados horizontalmente, e UNION
acrescenta conjunto de resultados verticalmente. A imagem a seguir ilustra a diferença entre UNION
e JOIN
:
Exemplos de MySQL UNION
e alias de coluna
Usaremos as tabelas customers
e employees
no banco de dados de exemplo para a demonstração:
Suponha que você queira combinar o nome e o sobrenome de funcionários e clientes em um único conjunto de resultados. Você pode usar o UNION
operador da seguinte maneira:
SELECT
firstName,
lastName
FROM
employees
UNION
SELECT
contactFirstName,
contactLastName
FROM
customers;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como você pode ver na saída, o MySQL UNION
usa os nomes das colunas da primeira SELECT
instrução para os títulos das colunas da saída.
Se quiser usar outros títulos de coluna, você precisará usar aliases de coluna explicitamente na primeira SELECT
instrução, conforme mostrado no exemplo a seguir:
SELECT
CONCAT(firstName,' ',lastName) fullname
FROM
employees
UNION SELECT
CONCAT(contactFirstName,' ',contactLastName)
FROM
customers;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Este exemplo usa o cabeçalho da coluna da primeira consulta para a saída. Ele usa a CONCAT()
função para concatenar nome, espaço e sobrenome em um nome completo.
MySQL UNION
eORDER BY
Se quiser classificar o conjunto de resultados de uma união, use uma ORDER BY
cláusula na última SELECT
instrução, conforme mostrado no exemplo a seguir:
SELECT
concat(firstName,' ',lastName) fullname
FROM
employees
UNION SELECT
concat(contactFirstName,' ',contactLastName)
FROM
customers
ORDER BY fullname;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que se você colocar a ORDER BY
cláusula em cada SELECT
instrução, isso não afetará a ordem das linhas no conjunto de resultados final.
Para diferenciar entre funcionários e clientes, você pode adicionar uma coluna conforme mostrado na consulta a seguir:
SELECT
CONCAT(firstName, ' ', lastName) fullname,
'Employee' as contactType
FROM
employees
UNION SELECT
CONCAT(contactFirstName, ' ', contactLastName),
'Customer' as contactType
FROM
customers
ORDER BY
fullname
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O MySQL também fornece uma opção alternativa para classificar um conjunto de resultados com base na posição da coluna usando a ORDER BY
seguinte cláusula:
SELECT
CONCAT(firstName,' ',lastName) fullname
FROM
employees
UNION SELECT
CONCAT(contactFirstName,' ',contactLastName)
FROM
customers
ORDER BY 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
No entanto, não é uma boa prática classificar o conjunto de resultados pela posição da coluna.
Neste tutorial, você aprendeu como usar UNION
a instrução MySQL para combinar dados de várias consultas em um único conjunto de resultados.