MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで2つのSELECT文の結果差分を取得する方法(NOT INサブクエリの使い方)

MySQLで2つのSELECT結果の差分を求めるには

MySQLでは、サブクエリを利用することで、2つのSELECT文の結果セットの差分(一方にのみ存在するレコード)を簡単に取得できます。基本的な構文は以下の通りです。

SELECT * FROM yourTableName WHERE yourColumnName NOT IN (SELECT yourColumnName FROM yourTableName WHERE yourCondition);

この構文では、外側のSELECTの結果から、サブクエリが返す値に含まれないレコードだけを抽出します。それでは、実際にテーブルを作成して動きを確認してみましょう。

サンプルテーブルの作成

まず、以下のクエリでテーブルを作成します。

mysql> create table DifferenceSelectDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> UserId int,
    -> UserValue int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.87 sec)

テストデータの挿入

次に、INSERT文を使ってレコードを挿入していきます。

mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(10,10);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(10,20);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(20,30);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(20,20);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(30,40);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(30,20);
Query OK, 1 row affected (0.15 sec)

登録データの確認

SELECT文ですべてのレコードを表示してみます。

mysql> select *from DifferenceSelectDemo;

実行結果は以下の通りです。

+----+--------+-----------+
| Id | UserId | UserValue |
+----+--------+-----------+
|  1 |     10 |        10 |
|  2 |     10 |        20 |
|  3 |     20 |        30 |
|  4 |     20 |        20 |
|  5 |     30 |        40 |
|  6 |     30 |        20 |
+----+--------+-----------+
6 rows in set (0.02 sec)

NOT INを使った差分取得クエリ

ここでは例として、「Id=1 のレコードのUserValue以外」をすべて抽出してみます。これにより、2つのSELECT結果の差分を取得できます。

mysql> select *from DifferenceSelectDemo
    -> WHERE UserValue NOT IN (select UserValue from DifferenceSelectDemo where Id=1);

実行結果は次のようになります。Id=1のレコード(UserValue=10)が除外され、残りの5件が返されているのがわかります。

+----+--------+-----------+
| Id | UserId | UserValue |
+----+--------+-----------+
|  2 |     10 |        20 |
|  3 |     20 |        30 |
|  4 |     20 |        20 |
|  5 |     30 |        40 |
|  6 |     30 |        20 |
+----+--------+-----------+
5 rows in set (0.09 sec)

補足:NOT IN使用時の注意点

NOT INを使う際は、サブクエリの結果にNULLが含まれる場合に注意が必要です。NULLが1つでも含まれていると、比較結果が不定となり、意図した通りに行が返らなくなります。そのような場合は、LEFT JOIN ... IS NULL を使った方法や NOT EXISTS を使うと、より安全かつ大規模データでも高速に差分を取得できるためおすすめです。

  1. MySQLで2つの日時(DATETIME)値の差を求める方法

    MySQLで2つの日時値の差を求める方法MySQLで2つのDATETIME型の値の差を求めるには、TIMESTAMPDIFF()関数を使用します。この関数を使うことで、秒・分・時間などの任意の単位で2つの日時の差を簡単に計算できます。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> DueDatetime1 datetime, -> DueDatetime2 datetime -> );Query OK, 0 rows affected (0.86 sec)次に、INSE

  2. C#で2つのDateTimeオブジェクト間の差をミリ秒単位で求める方法

    C#では、TimeSpan構造体を使うことで、2つのDateTimeオブジェクト間の時間差を簡単に計算できます。この記事では、その差をミリ秒単位で取得する方法を解説します。基本的な手順まず、比較対象となる2つのDateTimeオブジェクトを用意します。以下は、同じ日付の時刻が異なる2つのオブジェクトの例です。DateTime date1 = new DateTime(2018, 8, 11, 08, 15, 20); DateTime date2 = new DateTime(2018, 8, 11, 11, 14, 25);次に、2つの日時の差を求めます。DateTime同士は減算演算子(-