Mysql
 sql >> Database >  >> RDS >> Mysql

Come confrontare due tabelle in MySQL

A volte potrebbe essere necessario confrontare due tabelle in MySQL per trovare record corrispondenti o record non corrispondenti. Ecco la query SQL per confrontare due tabelle in MySQL.

Come confrontare due tabelle in MySQL

Ecco i passaggi per confrontare due tabelle in MySQL. Esistono diversi casi d'uso per confrontare due tabelle in SQL. Li esamineremo uno per uno. Supponiamo che tu abbia le seguenti 2 tabelle orders(id, order_date, amount) e ordini2(id, data_ordine, importo) che hanno 2 record identici.

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 |
+------+------------+--------+

Bonus Leggi:Come ottenere i dati dell'ultimo mese in MySQL

MySQL confronta due colonne di tabelle diverse

Supponiamo che tu voglia confrontare solo due colonne (ad es. id) di due diverse tabelle ordini e ordini2. Ecco la query SQL per confrontare due colonne di tabelle diverse e selezionare i record corrispondenti.

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 |
+------+------------+--------+

Nella query precedente, selezioniamo i record dagli ordini il cui id il valore della colonna è presente nell'elenco di id valori di colonna ottenuti da ordini2 utilizzando una sottoquery.

Allo stesso modo, se desideri confrontare due colonne e selezionare record che non corrispondono, aggiorna la query sopra aggiungendo una parola chiave NOT prima di IN, come mostrato di seguito.

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 |
+------+------------+--------+

Bonus Leggi:Come copiare la tabella in MySQL

MySQL confronta due tabelle per trovare i record corrispondenti

Se stai cercando di confrontare due tabelle e trovare record corrispondenti in base a più colonne, ecco la query SQL. Supponiamo che tu voglia trovare record identici confrontando più colonne id, data_ordine, importo

Per prima cosa eseguiamo un UNION ALL di due tabelle per conservare le righe duplicate.

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 |
+------+------------+--------+

Successivamente, eseguiamo un GROUP BY per contare i record per id, order_date e importo colonne per trovare i record con conteggio>1, ovvero i record che si verificano più di una volta. Usiamo la query precedente come sottoquery.

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 |
+------+------------+--------+

Bonus Leggi:Come aggiungere il vincolo NOT NULL in MySQL

MySQL confronta due tabelle per trovare record non corrispondenti

Allo stesso modo, ecco come confrontare due tabelle per trovare colonne non corrispondenti in MySQL. Nella query precedente, invece di utilizzare count(*)>1, utilizziamo la condizione count(*)=1, ovvero record che si verificano solo una volta.

Ecco l'SQL per confrontare due tabelle e trovare record senza corrispondenze.

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 |
+------+------------+--------+

Bonus Lettura:come aggiungere un vincolo predefinito in MySQL

MySQL confronta due tabelle di database diversi

Allo stesso modo, se vuoi confrontare due tabelle order e order2 rispettivamente da database diversi db1 e db2, anteponi ai nomi dei database prima dei nomi delle tabelle un punto (.)

Ecco la query SQL per confrontare due tabelle di database diversi e ottenere record corrispondenti.

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;

Ed ecco la query SQL per confrontare due tabelle di database diversi e ottenere record senza corrispondenza.

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;

Si spera che ora sia possibile confrontare due tabelle in MySQL

Ubiq semplifica la visualizzazione dei dati in pochi minuti e il monitoraggio in dashboard in tempo reale. Provalo oggi!