sql >> Databasteknik >  >> RDS >> Mysql

Hur man jämför två tabeller i MySQL

Ibland kan du behöva jämföra två tabeller i MySQL för att hitta matchade poster eller omatchade poster. Här är SQL-frågan för att jämföra två tabeller i MySQL.

Hur man jämför två tabeller i MySQL

Här är stegen för att jämföra två tabeller i MySQL. Det finns olika användningsfall för att jämföra två tabeller i SQL. Vi kommer att titta på var och en av dem en efter en. Låt oss säga att du har följande två tabeller order(id, order_date, summa) och orders2(id, order_date, summa) som har 2 identiska 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 |
+------+------------+--------+

Bonus Läs:Hur man får senaste månadsdata i MySQL

MySQL Jämför två kolumner från olika tabeller

Låt oss säga att du bara vill jämföra två kolumner (t.ex. id) från två olika tabeller order och order2. Här är SQL-frågan för att jämföra två kolumner från olika tabeller och välja poster som matchar.

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 ovanstående fråga väljer vi poster från beställningar vars id kolumnvärdet finns i listan över id kolumnvärden erhållna från order2 med hjälp av en underfråga.

På liknande sätt, om du vill jämföra två kolumner och välja poster som inte matchar, uppdatera frågan ovan genom att lägga till ett NOT-sökord före IN, som visas nedan.

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:Hur man kopierar tabell i MySQL

MySQL Jämför två tabeller för att hitta matchade poster

Om du vill jämföra två tabeller och hitta matchade poster baserade på flera kolumner, är här SQL-frågan. Låt oss säga att du vill hitta identiska poster genom att jämföra flera kolumner id, order_date, amount

Först gör vi en UNION ALLA två tabeller för att behålla dubbletter av rader.

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

Därefter gör vi en GROUP BY för att räkna poster efter id, order_date och summa kolumner för att hitta poster med count>1, det vill säga poster som förekommer mer än en gång. Vi använder ovanstående fråga som underfråga.

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:Hur man lägger till NOT NULL-begränsning i MySQL

MySQL Jämför två tabeller för att hitta omatchade poster

På samma sätt, här är hur du jämför två tabeller för att hitta omatchade kolumner i MySQL. I ovanstående fråga, istället för att använda count(*)>1, använder vi villkoret count(*)=1, det vill säga poster som bara förekommer en gång.

Här är SQL för att jämföra två tabeller och hitta poster utan matchningar.

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äsning:Hur man lägger till standardbegränsning i MySQL

MySQL jämför två tabeller från olika databaser

På liknande sätt, om du vill jämföra två tabellordningar och order2 från olika databaser db1 respektive db2, är det bara att prefixa databasnamnen före tabellnamnen med en punkt(.)

Här är SQL-frågan för att jämföra två tabeller från olika databaser och få matchade 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;

Och här är SQL-frågan för att jämföra två tabeller från olika databaser och få omatchade 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;

Förhoppningsvis kan du nu jämföra två tabeller i MySQL

Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!

  1. Hur skapar man en SQL Server-funktion för att sammanfoga flera rader från en underfråga till ett enda avgränsat fält?

  2. Hur man skapar en procedur i ett paket i Oracle

  3. JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() i MySQL:Vad är skillnaden?

  4. Mysql-fråga för att dynamiskt konvertera rader till kolumner på basis av två kolumner