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

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 NULLNOT EXISTS を使う方法も検討するとよいでしょう。

  1. MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)

    MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected