Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak porównać dwie tabele w MySQL?

Czasami może być konieczne porównanie dwóch tabel w MySQL, aby znaleźć pasujące lub niepasujące rekordy. Oto zapytanie SQL do porównania dwóch tabel w MySQL.

Jak porównać dwie tabele w MySQL

Oto kroki, aby porównać dwie tabele w MySQL. Istnieją różne przypadki użycia do porównywania dwóch tabel w SQL. Przyjrzymy się każdemu z nich po kolei. Załóżmy, że masz następujące 2 tabele zamówienia(id, data_zamówienia, kwota) i zamówienia2(id, data_zamówienia, kwota) które mają 2 identyczne rekordy.

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

Przeczytaj bonus:Jak uzyskać dane z ostatniego miesiąca w MySQL

MySQL Porównaj dwie kolumny z różnych tabel

Załóżmy, że chcesz porównać tylko dwie kolumny (np. identyfikator) z dwóch różnych tabel zamówienia i zamówienia2. Oto zapytanie SQL do porównania dwóch kolumn z różnych tabel i wybrania pasujących rekordów.

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

W powyższym zapytaniu wybieramy rekordy z zamówień, których id wartość kolumny znajduje się na liście id wartości kolumn uzyskane z zamówień2 przy użyciu podzapytania.

Podobnie, jeśli chcesz porównać dwie kolumny i wybrać rekordy, które nie pasują, zaktualizuj powyższe zapytanie, dodając słowo kluczowe NOT przed IN, jak pokazano poniżej.

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

Przeczytaj bonus:Jak skopiować tabelę do MySQL

MySQL Porównaj dwie tabele, aby znaleźć pasujące rekordy

Jeśli chcesz porównać dwie tabele i znaleźć pasujące rekordy na podstawie wielu kolumn, oto zapytanie SQL. Załóżmy, że chcesz znaleźć identyczne rekordy, porównując wiele kolumn id, data_zamówienia, kwota

Najpierw wykonujemy UNION ALL z dwóch tabel, aby zachować zduplikowane wiersze.

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

Następnie wykonujemy GROUP BY, aby policzyć rekordy według id, zamówienia_daty i kwoty kolumn, aby znaleźć rekordy z count>1, czyli rekordy, które występują więcej niż raz. Używamy powyższego zapytania jako podzapytania.

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

Przeczytaj bonus:Jak dodać ograniczenie NOT NULL w MySQL

MySQL porównuje dwie tabele, aby znaleźć niepasujące rekordy

Podobnie, oto jak porównać dwie tabele, aby znaleźć niedopasowane kolumny w MySQL. W powyższym zapytaniu zamiast count(*)>1 używamy warunku count(*)=1, czyli rekordów, które występują tylko raz.

Oto SQL do porównywania dwóch tabel i znajdowania rekordów bez dopasowań.

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

Przeczytaj bonus:Jak dodać domyślne ograniczenie w MySQL

MySQL porównuje dwie tabele z różnych baz danych

Podobnie, jeśli chcesz porównać dwie rzędy tabel i zamówienia2 z różnych baz danych odpowiednio db1 i db2, po prostu poprzedź nazwy baz danych przed nazwami tabel kropką(.)

Oto zapytanie SQL do porównania dwóch tabel z różnych baz danych i uzyskania pasujących rekordów.

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;

A oto zapytanie SQL do porównania dwóch tabel z różnych baz danych i uzyskania niedopasowanych rekordów.

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;

Mam nadzieję, że teraz możesz porównać dwie tabele w MySQL

Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Jak zezwolić na zdalne połączenie z mysql

  2. Uzyskaj całkowitą liczbę wierszy, gdy używasz LIMIT?

  3. Czy Hibernate może współpracować ze składnią ON DUPLICATE KEY UPDATE w MySQL?

  4. 10 powodów, aby trzymać się MySQL

  5. Instalacja MySQL:BŁĄD:Nie udało się zbudować natywnego rozszerzenia gem