MySQLでテーブルBに存在しないテーブルAのレコードを抽出する方法
あるテーブルから、別のテーブルには存在しないレコードだけを抽出したい場合、NOT IN 演算子を使用することで簡単に実現できます。本記事では、実際にテーブルを作成しながら、その具体的な手順をわかりやすく解説します。
サンプルテーブルAの作成
まず、1つ目のテーブル「A」を作成します。テーブル作成のクエリは以下のとおりです。
mysql> create table A
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.56 sec)テーブルAへのデータ挿入
次に、INSERT文を使ってテーブルAにいくつかのレコードを挿入します。
mysql> insert into A values(10); Query OK, 1 row affected (0.23 sec) mysql> insert into A values(20); Query OK, 1 row affected (0.11 sec) mysql> insert into A values(30); Query OK, 1 row affected (0.11 sec) mysql> insert into A values(50); Query OK, 1 row affected (0.10 sec) mysql> insert into A values(80); Query OK, 1 row affected (0.12 sec)
テーブルAの全レコードを確認
SELECT文でテーブルAの全レコードを表示してみましょう。
mysql> select *from A;
実行結果は以下のとおりです。
+-------+ | Value | +-------+ | 10 | | 20 | | 30 | | 50 | | 80 | +-------+ 5 rows in set (0.00 sec)
サンプルテーブルBの作成
続いて、2つ目のテーブル「B」を作成します。
mysql> create table B -> ( -> Value2 int -> ); Query OK, 0 rows affected (0.65 sec)
テーブルBへのデータ挿入
INSERT文を使って、テーブルBにもレコードを追加します。
mysql> insert into B values(20); Query OK, 1 row affected (0.11 sec) mysql> insert into B values(50); Query OK, 1 row affected (0.15 sec)
テーブルBの全レコードを確認
SELECT文でテーブルBの中身を確認しておきましょう。
mysql> select *from B;
実行結果は以下のとおりです。
+--------+ | Value2 | +--------+ | 20 | | 50 | +--------+ 2 rows in set (0.00 sec)
NOT INを使った差分抽出クエリ
準備が整いました。それでは、テーブルAのうちテーブルBに存在しないレコードを抽出するクエリを見てみましょう。サブクエリと組み合わせてNOT INを使用します。
mysql> SELECT * FROM A WHERE Value NOT IN (SELECT Value2 FROM B);
実行結果は以下のとおりです。テーブルBに含まれていない「10」「30」「80」のみが取得できていることがわかります。
+-------+ | Value | +-------+ | 10 | | 30 | | 80 | +-------+ 3 rows in set (0.00 sec)
補足:NULL値に注意しよう
NOT INを使用する際は注意点があります。サブクエリの結果にNULLが含まれている場合、比較結果が常にUNKNOWNとなり、意図した通りにレコードが返されないことがあります。そのような場合は、LEFT JOIN ... IS NULL や NOT EXISTS を使う方法も検討するとよいでしょう。
-
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected