Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como comparar duas tabelas no MySQL


Às vezes você pode precisar comparar duas tabelas no MySQL para encontrar registros correspondentes ou registros não correspondentes. Aqui está a consulta SQL para comparar duas tabelas no MySQL.


Como comparar duas tabelas no MySQL


Aqui estão os passos para comparar duas tabelas no MySQL. Existem diferentes casos de uso para comparar duas tabelas no SQL. Veremos cada um deles um por um. Digamos que você tenha as duas tabelas a seguir orders(id, order_date, amount) e orders2(id, order_date, valor) que possuem 2 registros idênticos.
mysql> create table orders(id int, order_date date, amount int);

mysql> insert into orders(id, order_date, amount)
     values(1,'2020-07-25',250),
     (2,'2020-07-26',350),
     (3,'2020-07-27',200),
     (4,'2020-07-28',150);

mysql> select * from orders;
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    1 | 2020-07-25 |    250 |
|    2 | 2020-07-26 |    350 |
|    3 | 2020-07-27 |    200 |
|    4 | 2020-07-28 |    150 |
+------+------------+--------+

mysql> create table orders2(id int, order_date date, amount int);

mysql> insert into orders2(id, order_date, amount)
     values(3,'2020-07-27',200),
     (4,'2020-07-28',150),
     (5,'2020-07-29',250),
     (6,'2020-07-30',300);

mysql> select * from orders2;
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    3 | 2020-07-27 |    200 |
|    4 | 2020-07-28 |    150 |
|    5 | 2020-07-29 |    250 |
|    6 | 2020-07-30 |    300 |
+------+------------+--------+

Bônus de leitura:Como obter dados do último mês no MySQL


MySQL compara duas colunas de tabelas diferentes


Digamos que você queira apenas comparar duas colunas (por exemplo, id) de duas tabelas diferentes pedidos e pedidos2. Aqui está a consulta SQL para comparar duas colunas de tabelas diferentes e selecionar os registros correspondentes.
mysql> select * from orders
       where id in
       (select id from orders2);
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    3 | 2020-07-27 |    200 |
|    4 | 2020-07-28 |    150 |
+------+------------+--------+

Na consulta acima, selecionamos registros de pedidos cujo id o valor da coluna está presente na lista de id valores de coluna obtidos de orders2 usando uma subconsulta.

Da mesma forma, se você quiser comparar duas colunas e selecionar registros que não correspondem, atualize a consulta acima adicionando uma palavra-chave NOT antes de IN, conforme mostrado abaixo.


mysql> select * from orders
            where id NOT in
            (select id from orders2);
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    1 | 2020-07-25 |    250 |
|    2 | 2020-07-26 |    350 |
+------+------------+--------+

Bônus de leitura:Como copiar tabela no MySQL


O MySQL compara duas tabelas para encontrar registros correspondentes


Se você deseja comparar duas tabelas e encontrar registros correspondentes com base em várias colunas, aqui está a consulta SQL. Digamos que você queira encontrar registros idênticos comparando várias colunas id, order_date, amount

Primeiro fazemos um UNION ALL de duas tabelas para reter as linhas duplicadas.
mysql> select id, order_date, amount
     from orders
     union all
     select id, order_date, amount
     from orders2;
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    1 | 2020-07-25 |    250 |
|    2 | 2020-07-26 |    350 |
|    3 | 2020-07-27 |    200 |
|    4 | 2020-07-28 |    150 |
|    3 | 2020-07-27 |    200 |
|    4 | 2020-07-28 |    150 |
|    5 | 2020-07-29 |    250 |
|    6 | 2020-07-30 |    300 |
+------+------------+--------+

Em seguida, fazemos um GROUP BY para contar registros por id, order_date e valor colunas para localizar registros com contagem>1, ou seja, registros que ocorrem mais de uma vez. Usamos a consulta acima como subconsulta.
mysql> select id, order_date, amount
       from (
           select id, order_date, amount
           from orders
           union all
           select id, order_date, amount
           from orders2)
       temp
       group by id, order_date, amount
       having count(*)>1;
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    3 | 2020-07-27 |    200 |
|    4 | 2020-07-28 |    150 |
+------+------------+--------+

Leitura de bônus:Como adicionar restrição NOT NULL no MySQL


O MySQL compara duas tabelas para encontrar registros sem correspondência


Da mesma forma, veja como comparar duas tabelas para encontrar colunas sem correspondência no MySQL. Na consulta acima, ao invés de usar count(*)>1, usamos a condição count(*)=1, ou seja, registros que ocorrem apenas uma vez.

Aqui está o SQL para comparar duas tabelas e encontrar registros sem correspondências.
mysql> select id, order_date, amount
       from (
         select id, order_date, amount
         from orders
         union all
         select id, order_date, amount
         from orders2)
       temp
       group by id, order_date, amount
      having count(*)=1;
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    1 | 2020-07-25 |    250 |
|    2 | 2020-07-26 |    350 |
|    5 | 2020-07-29 |    250 |
|    6 | 2020-07-30 |    300 |
+------+------------+--------+

Bônus de leitura:Como adicionar restrição padrão no MySQL


O MySQL compara duas tabelas de bancos de dados diferentes


Da mesma forma, se você quiser comparar duas tabelas orders e orders2 de diferentes bancos de dados db1 e db2 respectivamente, basta prefixar os nomes dos bancos de dados antes dos nomes das tabelas com um ponto (.)

Aqui está a consulta SQL para comparar duas tabelas de bancos de dados diferentes e obter registros correspondentes.
mysql> select id, order_date, amount
       from (
           select id, order_date, amount
           from db1.orders
           union all
           select id, order_date, amount
           from db2.orders2)
       temp
       group by id, order_date, amount
       having count(*)>1;

E aqui está a consulta SQL para comparar duas tabelas de bancos de dados diferentes e obter registros sem correspondência.


mysql> select id, order_date, amount
       from (
           select id, order_date, amount
           from db1.orders
           union all
           select id, order_date, amount
           from db2.orders2)
       temp
       group by id, order_date, amount
       having count(*)>1;

Espero que agora você possa comparar duas tabelas no MySQL

O Ubiq facilita a visualização de dados em minutos e o monitoramento em painéis em tempo real. Experimente hoje!