Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment comparer deux tables dans MySQL

Parfois, vous devrez peut-être comparer deux tables dans MySQL pour trouver des enregistrements correspondants ou des enregistrements non correspondants. Voici la requête SQL pour comparer deux tables dans MySQL.

Comment comparer deux tables dans MySQL

Voici les étapes pour comparer deux tables dans MySQL. Il existe différents cas d'utilisation pour comparer deux tables en SQL. Nous allons les examiner un par un. Disons que vous avez les 2 tables suivantes orders(id, order_date, amount) et commandes2(id, date_commande, montant) qui ont 2 enregistrements identiques.

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

Lecture bonus :comment obtenir les données du dernier mois dans MySQL

MySQL compare deux colonnes de tables différentes

Supposons que vous ne souhaitiez comparer que deux colonnes (par exemple, id) de deux tables différentes commandes et commandes2. Voici la requête SQL pour comparer deux colonnes de différentes tables et sélectionner les enregistrements qui correspondent.

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

Dans la requête ci-dessus, nous sélectionnons les enregistrements des commandes dont l'id la valeur de la colonne est présente dans la liste des id valeurs de colonne obtenues à partir des commandes2 à l'aide d'une sous-requête.

De même, si vous souhaitez comparer deux colonnes et sélectionner des enregistrements qui ne correspondent pas, mettez à jour la requête ci-dessus en ajoutant un mot clé NOT avant IN, comme indiqué ci-dessous.

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

Lecture bonus :comment copier une table dans MySQL

MySQL compare deux tables pour trouver les enregistrements correspondants

Si vous cherchez à comparer deux tables et à trouver des enregistrements correspondants basés sur plusieurs colonnes, voici la requête SQL. Supposons que vous souhaitiez rechercher des enregistrements identiques en comparant plusieurs colonnes id, order_date, amount

Nous faisons d'abord un UNION ALL de deux tables pour conserver les lignes en double.

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

Ensuite, nous faisons un GROUP BY pour compter les enregistrements par id, order_date et amount colonnes pour rechercher des enregistrements avec count>1, c'est-à-dire des enregistrements qui apparaissent plus d'une fois. Nous utilisons la requête ci-dessus comme sous-requête.

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 Read :Comment ajouter une contrainte NOT NULL dans MySQL

MySQL compare deux tables pour trouver des enregistrements sans correspondance

De même, voici comment comparer deux tables pour trouver des colonnes sans correspondance dans MySQL. Dans la requête ci-dessus, au lieu d'utiliser count(*)>1, nous utilisons la condition count(*)=1, c'est-à-dire des enregistrements qui n'apparaissent qu'une seule fois.

Voici le SQL pour comparer deux tables et trouver des enregistrements sans correspondance.

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

Lecture bonus :comment ajouter une contrainte par défaut dans MySQL

MySQL compare deux tables de bases de données différentes

De même, si vous souhaitez comparer deux tables commandes et commandes2 de différentes bases de données db1 et db2 respectivement, préfixez simplement les noms de base de données avant les noms de table avec un point (.)

Voici la requête SQL pour comparer deux tables de bases de données différentes et obtenir des enregistrements correspondants.

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;

Et voici la requête SQL pour comparer deux tables de bases de données différentes et obtenir des enregistrements sans correspondance.

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;

J'espère que vous pouvez maintenant comparer deux tables dans MySQL

Ubiq facilite la visualisation des données en quelques minutes et la surveillance dans des tableaux de bord en temps réel. Essayez-le aujourd'hui !