O MySQL não suporta a junção externa completa pronta para uso, ao contrário de outros bancos de dados, como PostgreSQL e SQL Server. Portanto, você precisará fazer uma junção externa completa usando uma combinação de outros tipos de junção, como LEFT JOIN e RIGHT JOIN, que são suportados no MySQL. Neste artigo, veremos como fazer uma junção externa completa no MySQL.
Como fazer uma junção externa completa no MySQL
Aqui estão as etapas para fazer uma junção externa completa no MySQL.
Digamos que você tenha as duas tabelas a seguir vendas e pedidos .
mysql> select * from sales; +------+---------------------+--------+ | id | order_date | amount | +------+---------------------+--------+ | 1 | 2021-02-02 08:15:00 | 250 | | 2 | 2021-02-02 08:30:00 | 200 | | 3 | 2021-02-02 08:55:00 | 150 | | 4 | 2021-02-02 09:15:00 | 125 | | 5 | 2021-02-02 09:30:00 | 250 | | 6 | 2021-02-02 09:45:00 | 200 | | 7 | 2021-02-02 10:15:00 | 180 | | 8 | 2021-02-02 10:30:00 | 125 | | 9 | 2021-02-02 10:45:00 | 200 | | 10 | 2021-02-02 11:15:00 | 250 | | 11 | 2021-02-02 11:30:00 | 150 | | 12 | 2021-02-02 11:45:00 | 200 | +------+---------------------+--------+ mysql> select * from orders; +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 5 | 2021-01-28 | 250 | | 6 | 2021-01-29 | 250 | | 7 | 2021-01-30 | 250 | | 8 | 2021-01-31 | 250 | | 9 | 2021-02-01 | 250 | +------+------------+--------+
Aqui está a sintaxe geral para fazer uma junção externa completa no MySQL entre tabelas t1 e t2 com base no campo JOIN id . Você pode atualizar os nomes das tabelas e o campo de junção conforme sua necessidade.
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NULL
A consulta acima também retornará linhas duplicadas, se houver. Se você não quiser registros duplicados em junção externa completa, use a consulta a seguir.
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
Aqui está a consulta SQL para fazer uma junção externa completa entre as tabelas vendas e pedidos .
mysql> SELECT * FROM sales LEFT JOIN orders ON sales.id = orders.id UNION ALL SELECT * FROM sales RIGHT JOIN orders ON sales.id = orders.id WHERE sales.id IS NULL ; +------+---------------------+--------+------+------------+--------+ | id | order_date | amount | id | order_date | amount | +------+---------------------+--------+------+------------+--------+ | 5 | 2021-02-02 09:30:00 | 250 | 5 | 2021-01-28 | 250 | | 6 | 2021-02-02 09:45:00 | 200 | 6 | 2021-01-29 | 250 | | 7 | 2021-02-02 10:15:00 | 180 | 7 | 2021-01-30 | 250 | | 8 | 2021-02-02 10:30:00 | 125 | 8 | 2021-01-31 | 250 | | 9 | 2021-02-02 10:45:00 | 200 | 9 | 2021-02-01 | 250 | | 1 | 2021-02-02 08:15:00 | 250 | NULL | NULL | NULL | | 2 | 2021-02-02 08:30:00 | 200 | NULL | NULL | NULL | | 3 | 2021-02-02 08:55:00 | 150 | NULL | NULL | NULL | | 4 | 2021-02-02 09:15:00 | 125 | NULL | NULL | NULL | | 10 | 2021-02-02 11:15:00 | 250 | NULL | NULL | NULL | | 11 | 2021-02-02 11:30:00 | 150 | NULL | NULL | NULL | | 12 | 2021-02-02 11:45:00 | 200 | NULL | NULL | NULL | +------+---------------------+--------+------+------------+--------+
Aqui está a consulta SQL para fazer a junção externa completa sem nenhuma linha duplicada no resultado.
mysql> SELECT * FROM sales LEFT JOIN orders ON sales.id = orders.id UNION SELECT * FROM sales RIGHT JOIN orders ON sales.id = orders.id;
Precisa de uma ferramenta de relatório para MySQL? O Ubiq facilita a visualização de dados em minutos e o monitoramento em painéis em tempo real. Experimente hoje!