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

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

MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法

データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。

1. 最初のテーブルを作成する

まずは比較元となる最初のテーブルを作成します。

mysql> create table FirstTableDemo
   -> (
   -> id int,
   -> name varchar(100)
   -> );
Query OK, 0 rows affected (0.48 sec)

続いて、最初のテーブルにレコードを挿入します。

mysql> insert into FirstTableDemo values(1,'Bob'),(2,'John'),(3,'Carol');
Query OK, 3 rows affected (0.13 sec)
Records: 3  Duplicates: 0  Warnings: 0

すべてのレコードを表示して確認しましょう。

mysql> select *from FirstTableDemo;

以下が出力結果です。

+------+-------+
| id   | name  |
+------+-------+
|    1 | Bob   |
|    2 | John  |
|    3 | Carol |
+------+-------+
3 rows in set (0.00 sec)

2. 2つ目のテーブルを作成する

次に、比較先となる2つ目のテーブルを作成します。

mysql> create table SecondTableDemo
   -> (
   -> id int,
   -> name varchar(100)
   -> );
Query OK, 0 rows affected (0.62 sec)

2つ目のテーブルにもレコードを挿入します。ここでは意図的に「Carol」のレコードを含めていません。

mysql> insert into SecondTableDemo values(1,'Bob'),(2,'John');
Query OK, 2 rows affected (0.12 sec)
Records: 2  Duplicates: 0  Warnings: 0

すべてのレコードを表示します。

mysql> select *from SecondTableDemo;

以下が出力結果です。

+------+------+
| id   | name |
+------+------+
|    1 | Bob  |
|    2 | John |
+------+------+

3. NATURAL LEFT JOINで差分の行を抽出する

2つ目のテーブルに存在しない行を選択するための構文は以下の通りです。NATURAL LEFT JOINの結果、一致しない行は右側のカラムがNULLになるため、WHERE句でIS NULLを指定することで差分だけを取り出せます。

mysql> SELECT tbl1.*
    -> FROM FirstTableDemo tbl1
    -> NATURAL LEFT JOIN  SecondTableDemo tbl2
    -> where tbl2.name IS NULL;

以下が出力結果です。1つ目のテーブルには存在するが、2つ目のテーブルには存在しない行、つまり「Carol」だけが表示されました。

+------+-------+
| id   | name  |
+------+-------+
|    3 | Carol |
+------+-------+
1 row in set (0.03 sec)

まとめ

NATURAL LEFT JOINとIS NULLを組み合わせることで、テーブル間の差分レコードを簡単に抽出できます。同様の処理はNOT INNOT EXISTSを使っても実現できますが、カラム名が共通している場合はNATURAL LEFT JOINがシンプルで便利です。データ同期のチェックや整合性確認など、さまざまな場面で活用できるテクニックなので、ぜひ覚えておきましょう。


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

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

  2. MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

    MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec