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ś!