sql >> Database >  >> RDS >> Mysql

Twee tabellen vergelijken in MySQL

Soms moet u mogelijk twee tabellen in MySQL vergelijken om overeenkomende of niet-overeenkomende records te vinden. Hier is de SQL-query om twee tabellen in MySQL te vergelijken.

Hoe twee tabellen in MySQL te vergelijken

Hier zijn de stappen om twee tabellen in MySQL te vergelijken. Er zijn verschillende use-cases om twee tabellen in SQL te vergelijken. We zullen ze allemaal één voor één bekijken. Stel dat u de volgende 2 tabellen orders(id, order_date, hoeveelheid) . heeft en orders2(id, order_date, bedrag) die 2 identieke records hebben.

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 lezen:hoe u gegevens van de laatste maand in MySQL kunt krijgen

MySQL Vergelijk twee kolommen uit verschillende tabellen

Stel dat u slechts twee kolommen (bijv. id) uit twee verschillende tabellen orders wilt vergelijken en bestellingen2. Hier is de SQL-query om twee kolommen uit verschillende tabellen te vergelijken en records te selecteren die overeenkomen.

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

In de bovenstaande zoekopdracht selecteren we records van bestellingen waarvan de id kolomwaarde is aanwezig in de lijst met id kolomwaarden verkregen uit bestellingen2 met behulp van een subquery.

Evenzo, als u twee kolommen wilt vergelijken en records wilt selecteren die niet overeenkomen, werkt u de bovenstaande zoekopdracht bij door een NOT-trefwoord toe te voegen vóór IN, zoals hieronder weergegeven.

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 lezen:tabel kopiëren in MySQL

MySQL Vergelijk twee tabellen om overeenkomende records te vinden

Als u twee tabellen wilt vergelijken en overeenkomende records wilt vinden op basis van meerdere kolommen, dan is hier de SQL-query. Stel dat u identieke records wilt vinden door meerdere kolommen te vergelijken id, order_date, bedrag

Eerst doen we een UNION ALL van twee tabellen om dubbele rijen te behouden.

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

Vervolgens doen we een GROUP BY om records te tellen op id, order_date en bedrag kolommen om records met count>1 te vinden, dat wil zeggen records die meer dan eens voorkomen. We gebruiken de bovenstaande zoekopdracht als subquery.

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 Lezen:Hoe voeg ik een NOT NULL-beperking toe in MySQL

MySQL vergelijk twee tabellen om ongeëvenaarde records te vinden

Op dezelfde manier kunt u als volgt twee tabellen vergelijken om ongeëvenaarde kolommen in MySQL te vinden. In de bovenstaande query gebruiken we in plaats van count(*)>1 de conditie count(*)=1, dat wil zeggen records die maar één keer voorkomen.

Hier is de SQL om twee tabellen te vergelijken en records zonder overeenkomsten te vinden.

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 lezen:standaardbeperking toevoegen in MySQL

MySQL vergelijkt twee tabellen uit verschillende databases

Evenzo, als u twee tabellenorders en orders2 uit verschillende databases db1 en db2 wilt vergelijken, plaatst u de databasenamen vóór de tabelnamen met een punt(.)

Hier is de SQL-query om twee tabellen uit verschillende databases te vergelijken en overeenkomende records te krijgen.

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;

En hier is de SQL-query om twee tabellen uit verschillende databases te vergelijken en ongeëvenaarde records te krijgen.

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;

Hopelijk kun je nu twee tabellen vergelijken in MySQL

Ubiq maakt het gemakkelijk om gegevens binnen enkele minuten te visualiseren en in realtime dashboards te controleren. Probeer het vandaag nog!

  1. Hoe jsonb-arrays op te vragen met de IN-operator

  2. Een subset van kolommen selecteren uit de resultatenset van een opgeslagen procedure (T-SQL)

  3. Hoe het interval tussen twee datums in PostgreSQL te vinden

  4. Toptrends in databasebeheer