2つのMySQLテーブル間で欠落している値を見つける方法【NOT IN句の使い方】
はじめに
2つのMySQLテーブルを比較して、片方のテーブルには存在しない値(欠落している値)を抽出したい場面はよくあります。そんなときに便利なのが NOT IN 句です。この記事では、具体的なサンプルコードとともに、2つのテーブル間で欠落している値を見つける方法をわかりやすく解説します。
手順1:1つ目のテーブルを作成する
まず、比較元となるテーブルを作成しましょう。
mysql> create table DemoTable1(Value int);
Query OK, 0 rows affected (0.56 sec)
次に、INSERT文を使ってレコードを挿入します。
mysql> insert into DemoTable1 values(1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1 values(2);
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable1 values(5);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1 values(6);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1 values(8);
Query OK, 1 row affected (0.16 sec)
SELECT文ですべてのレコードを確認してみましょう。
mysql> select *from DemoTable1;
実行結果は以下の通りです。
+-------+
| Value |
+-------+
| 1 |
| 2 |
| 5 |
| 6 |
| 8 |
+-------+
5 rows in set (0.00 sec)
手順2:2つ目のテーブルを作成する
続いて、比較先となる2つ目のテーブルを作成します。
mysql> create table DemoTable2(Value int);
Query OK, 0 rows affected (1.19 sec)
同様に、INSERT文でレコードを挿入していきます。
mysql> insert into DemoTable2 values(1);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable2 values(2);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable2 values(3);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable2 values(4);
Query OK, 1 row affected (0.12 sec)
SELECT文で内容を確認します。
mysql> select *from DemoTable2;
実行結果は以下の通りです。
+-------+
| Value |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
手順3:NOT IN句で欠落している値を抽出する
それでは本題です。DemoTable1には存在するものの、DemoTable2には存在しない値を取得するには、以下のようなクエリを実行します。
mysql> select Value from DemoTable1 where Value not in(select Value from DemoTable2);
実行結果は以下の通りです。
+-------+
| Value |
+-------+
| 5 |
| 6 |
| 8 |
+-------+
3 rows in set (0.07 sec)
クエリの仕組み
このクエリでは、まずサブクエリ「select Value from DemoTable2」によってDemoTable2のすべての値(1, 2, 3, 4)が取得されます。その後、外側のクエリがDemoTable1の中から、これらの値に含まれないレコードだけを抽出します。その結果、「5」「6」「8」という3つの値が欠落している値として返されました。
補足:NOT EXISTSとの違い
大規模なテーブルを扱う場合やNULL値が含まれる可能性がある場合は、NOT EXISTS を使う方法も検討するとよいでしょう。NOT INはサブクエリの結果にNULLが1つでも含まれると正しく動作しないことがあるため、そのようなケースではNOT EXISTSの方が安全かつパフォーマンス面でも有利になる場合があります。
mysql> select Value from DemoTable1 t1
-> where not exists(
-> select 1 from DemoTable2 t2 where t2.Value = t1.Value);
まとめ
2つのMySQLテーブル間で欠落している値を見つけるには、NOT IN句を使うのが最もシンプルな方法です。基本的な構文を覚えておけば、データ整合性のチェックや差分抽出など、さまざまな場面で活用できます。データ量が多い場合やNULLを含む可能性がある場合は、NOT EXISTSの利用もあわせて検討してみてください。
-
MySQLで特定のカラム名を持つテーブルを検索する方法
MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a
-
2つのNumPy配列の共通要素(積集合)を求める方法
この記事では、2つのNumPy配列の共通部分(積集合)を求める方法を解説します。2つの配列の「共通部分」とは、元の両方の配列に共通して含まれる要素だけを集めた配列のことです。NumPyにはこの目的に特化した np.intersect1d() 関数が用意されており、わずか1行のコードで共通要素を抽出できます。アルゴリズム処理の手順は以下の通りです。NumPyをインポートします。2つのNumPy配列を定義します。np.intersect1d() 関数を使って、配列同士の共通部分を求めます。共通する要素からなる配列を出力します。サンプルコードimport numpy as np array_1 =