sql >> データベース >  >> RDS >> Mysql

MySQLで2つのテーブルを比較する方法

    一致するレコードまたは一致しないレコードを見つけるために、MySQLの2つのテーブルを比較する必要がある場合があります。 MySQLの2つのテーブルを比較するためのSQLクエリは次のとおりです。

    MySQLで2つのテーブルを比較する方法

    MySQLで2つのテーブルを比較する手順は次のとおりです。 SQLで2つのテーブルを比較するためのさまざまなユースケースがあります。それぞれを1つずつ見ていきます。次の2つのテーブルがあるとしますorders(id、order_date、amount) およびorders2(id、order_date、amount) 2つの同一のレコードがあります。

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

    ボーナスリード:MySQLで過去1か月のデータを取得する方法

    MySQLは異なるテーブルの2つの列を比較します

    2つの異なるテーブルの2つの列(idなど)のみを比較したいとします order およびorders2。 異なるテーブルの2つの列を比較し、一致するレコードを選択するためのSQLクエリは次のとおりです。

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

    上記のクエリでは、 idの注文からレコードを選択します 列の値はidのリストにあります サブクエリを使用してorders2から取得した列の値。

    同様に、2つの列を比較して一致しないレコードを選択する場合は、以下に示すように、INの前にNOTキーワードを追加して、上記のクエリを更新します。

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

    ボーナスリード:MySQLでテーブルをコピーする方法

    MySQLは2つのテーブルを比較して一致するレコードを見つける

    2つのテーブルを比較し、複数の列に基づいて一致するレコードを見つける場合は、ここにSQLクエリがあります。複数の列id、order_date、amount を比較して、同一のレコードを検索するとします。

    最初に、重複する行を保持するために2つのテーブルのUNIONALLを実行します。

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

    次に、GROUP BYを実行して、レコードを id、order_date、amountでカウントします。 count> 1のレコード、つまり複数回発生するレコードを検索するための列。上記のクエリをサブクエリとして使用します。

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

    ボーナスリード:MySQLにNOTNULL制約を追加する方法

    MySQLは2つのテーブルを比較して一致しないレコードを見つけます

    同様に、2つのテーブルを比較して、MySQLで一致しない列を見つける方法は次のとおりです。上記のクエリでは、count(*)> 1を使用する代わりに、条件count(*)=1を使用します。これは、1回だけ発生するレコードです。

    2つのテーブルを比較し、一致しないレコードを見つけるためのSQLは次のとおりです。

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

    ボーナスリード:MySQLにデフォルトの制約を追加する方法

    MySQLは異なるデータベースの2つのテーブルを比較します

    同様に、異なるデータベースdb1とdb2からの2つのテーブルordersとorders2をそれぞれ比較する場合は、テーブル名の前にデータベース名の前にドット(。)を付けるだけです。

    異なるデータベースの2つのテーブルを比較し、一致するレコードを取得するSQLクエリは次のとおりです。

    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;
    

    そして、これが異なるデータベースの2つのテーブルを比較し、一致しないレコードを取得するためのSQLクエリです。

    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;
    

    うまくいけば、My​​SQLで2つのテーブルを比較できるようになりました

    Ubiqを使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。

    1. 複数の行を更新するときにNULLタイプをキャストする

    2. MySQLでデータベースの文字セットと照合を設定する方法

    3. PostgreSQLテーブルのIDのシーケンスをリセットする方法

    4. 外部キーとして列を追加すると、外部キー制約で参照されているERROR列が存在しません