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 !