Nogle gange skal du måske sammenligne to tabeller i MySQL for at finde matchede poster eller umatchede poster. Her er SQL-forespørgslen til at sammenligne to tabeller i MySQL.
Sådan sammenlignes to tabeller i MySQL
Her er trinene til at sammenligne to tabeller i MySQL. Der er forskellige use cases til at sammenligne to tabeller i SQL. Vi vil se på hver af dem én efter én. Lad os sige, at du har følgende 2 tabeller ordrer(id, ordre_dato, beløb) og ordrer2(id, ordredato, beløb) der har 2 identiske poster.
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 | +------+------------+--------+
Bonuslæser:Sådan får du sidste måneds data i MySQL
MySQL Sammenlign to kolonner fra forskellige tabeller
Lad os sige, at du kun ønsker at sammenligne to kolonner (f.eks. id) fra to forskellige tabeller ordrer og ordrer2. Her er SQL-forespørgslen til at sammenligne to kolonner fra forskellige tabeller og vælge poster, der matcher.
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 | +------+------------+--------+
I ovenstående forespørgsel vælger vi poster fra ordrer, hvis id kolonneværdi er til stede på listen over id kolonneværdier hentet fra ordrer2 ved hjælp af en underforespørgsel.
Tilsvarende, hvis du vil sammenligne to kolonner og vælge poster, der ikke matcher, skal du opdatere forespørgslen ovenfor ved at tilføje et NOT-søgeord før IN, som vist nedenfor.
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 Læs:Sådan kopierer du tabel i MySQL
MySQL Sammenlign to tabeller for at finde matchede poster
Hvis du ønsker at sammenligne to tabeller og finde matchede poster baseret på flere kolonner, så er her SQL-forespørgsel. Lad os sige, at du vil finde identiske poster ved at sammenligne flere kolonner id, order_date, amount
Først laver vi en UNION ALLE to tabeller for at beholde duplikerede rækker.
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 | +------+------------+--------+
Dernæst laver vi en GROUP BY for at tælle poster efter id, ordre_dato og beløb kolonner for at finde poster med count>1, det vil sige poster, der forekommer mere end én gang. Vi bruger ovenstående forespørgsel som underforespørgsel.
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 Læs:Sådan tilføjes NOT NULL-begrænsning i MySQL
MySQL Sammenlign to tabeller for at finde uovertrufne poster
På samme måde kan du se her, hvordan du sammenligner to tabeller for at finde uovertrufne kolonner i MySQL. I ovenstående forespørgsel, i stedet for at bruge count(*)>1, bruger vi betingelsen count(*)=1, dvs. poster, der kun forekommer én gang.
Her er SQL'en til at sammenligne to tabeller og finde poster uden match.
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 | +------+------------+--------+
Bonuslæser:Sådan tilføjer du standardbegrænsning i MySQL
MySQL sammenligner to tabeller fra forskellige databaser
På samme måde, hvis du vil sammenligne to tabelordrer og ordrer2 fra forskellige databaser henholdsvis db1 og db2, skal du blot foranstille databasenavnene før tabelnavnene med en prik(.)
Her er SQL-forespørgslen til at sammenligne to tabeller fra forskellige databaser og få matchede poster.
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;
Og her er SQL-forespørgslen til at sammenligne to tabeller fra forskellige databaser og få umatchede poster.
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;
Forhåbentlig kan du nu sammenligne to tabeller i MySQL
Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!