Às vezes, você pode precisar encontrar linhas que não estão presentes em outra tabela ou selecionar linhas que não estão presentes em outra tabela. Neste artigo, veremos como mostrar linhas não presentes em outra tabela no MySQL, usando a cláusula NOT EXISTS.
Cláusula MySQL NOT EXISTS
O MySQL fornece cláusulas EXISTS, UNION e NOT EXISTS que ajudam você a realizar operações SET com tabelas MySQL. Por operações SET, queremos dizer que você pode tratar tabelas MySQL e resultados de consultas como conjuntos matemáticos e selecionar linhas que estão presentes em ambas as tabelas ou apenas em uma das tabelas. Para nosso artigo, usaremos a cláusula NOT EXISTS.
Como mostrar linhas não presentes em outra tabela
Aqui estão as etapas para localizar linhas não presentes em outra tabela. Digamos que você tenha duas tabelas sales(id, order_date, amount) e pedidos(id, order_date, valor)
mysql> create table sales(id int, order_date date, amount int); mysql> insert into sales(id, order_date, amount) values(1, '2021-01-24',250), (2, '2021-01-25',250), (3, '2021-01-26',250), (4, '2021-01-27',250), (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); mysql> select * from sales; +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 1 | 2021-01-24 | 250 | | 2 | 2021-01-25 | 250 | | 3 | 2021-01-26 | 250 | | 4 | 2021-01-27 | 250 | | 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 | +------+------------+--------+ mysql> create table orders(id int, order_date date, amount int); mysql> insert into orders(id, order_date, amount) values(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); 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 consulta SQL para selecionar dados de vendas tabela que não está presente em ordens tabela.
mysql> SELECT * FROM sales D WHERE NOT EXISTS(SELECT * FROM orders c WHERE D.order_date = C.order_date); +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 1 | 2021-01-24 | 250 | | 2 | 2021-01-25 | 250 | | 3 | 2021-01-26 | 250 | | 4 | 2021-01-27 | 250 | +------+------------+--------+
Na consulta acima, usamos a cláusula NOT EXISTS para selecionar a linha de vendas tabela que não estão presentes em ordens tabela, que são selecionados usando subconsulta. Na subconsulta, selecionamos apenas as linhas de pedidos tabela cuja order_date é igual ao de vendas tabela.
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!