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

MySQLのLEFT OUTER JOINで2つのテーブルを比較し、欠落しているIDを抽出する方法

2つのテーブルを比較して、片方に存在しないID(欠落しているID)を抽出したい場合は、MySQLのLEFT OUTER JOINを使用するのが効果的です。この記事では、実際にサンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。

1つ目のテーブル(First_Table)を作成する

まず、サンプル用のフィールドを持つテーブルを作成し、レコードを挿入していきます。1つ目のテーブルを作成するクエリは以下のとおりです。

mysql> create table First_Table
    -> (
    -> Id int
    -> );
Query OK, 0 rows affected (0.88 sec)

次に、INSERTコマンドを使ってテーブルにレコードを挿入します。クエリは以下のとおりです。

mysql> insert into First_Table values(1);
Query OK, 1 row affected (0.68 sec)
mysql> insert into First_Table values(2);
Query OK, 1 row affected (0.29 sec)
mysql> insert into First_Table values(3);
Query OK, 1 row affected (0.20 sec)
mysql> insert into First_Table values(4);
Query OK, 1 row affected (0.20 sec)

SELECT文を使って、テーブル内のすべてのレコードを表示してみましょう。

mysql> select *from First_Table;

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

+------+
| Id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

この時点で、First_Tableには「1、2、3、4」の4件のIDが登録されています。

2つ目のテーブル(Second_Table)を作成する

続いて、比較対象となる2つ目のテーブルを作成します。クエリは以下のとおりです。

mysql> create table Second_Table
    -> (
    -> Id int
    -> );
Query OK, 0 rows affected (0.60 sec)

同じようにINSERTコマンドでレコードを挿入します。今回は意図的に一部のIDだけを登録します。

mysql> insert into Second_Table values(2);
Query OK, 1 row affected (0.19 sec)
mysql> insert into Second_Table values(4);
Query OK, 1 row affected (0.20 sec)

SELECT文でテーブルの内容を確認してみましょう。

mysql> select *from Second_Table;

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

+------+
| Id   |
+------+
|    2 |
|    4 |
+------+
2 rows in set (0.00 sec)

Second_Tableには「2」と「4」の2件のみが登録されています。つまり、First_Tableには存在するものの、Second_Tableには存在しないIDは「1」と「3」ということになります。

LEFT OUTER JOINで欠落しているIDを抽出する

それでは、LEFT OUTER JOINを使用して、2つのテーブルを比較し、欠落しているIDを返すクエリを見ていきましょう。ポイントは、結合条件を指定したうえで、Second_Table側のIdがNULLである行をWHERE句で絞り込むことです。

mysql> SELECT First_Table.Id FROM First_Table
    -> LEFT OUTER JOIN Second_Table ON First_Table.Id = Second_Table.Id
    -> WHERE Second_Table.Id IS NULL;

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

+------+
| Id   |
+------+
| 1    |
| 3    |
+------+
2 rows in set (0.00 sec)

このように、First_Tableに存在するがSecond_Tableには存在しないID「1」と「3」が正しく抽出されました。

仕組みのポイント

LEFT OUTER JOINは、左側のテーブル(ここではFirst_Table)のすべての行を保持しつつ、右側のテーブル(Second_Table)に一致する行があれば結合し、一致する行がなければNULLを返します。そのため、「WHERE Second_Table.Id IS NULL」という条件を加えることで、右側のテーブルに該当データが存在しない行だけを取り出すことができるのです。

この手法は、データの整合性チェックや、同期漏れのレコード検出など、実務のさまざまなシーンで活用できるので、ぜひ覚えておきましょう。


  1. 左外部結合・右外部結合・完全外部結合の違いを徹底解説

    はじめにこの記事では、SQLにおける左外部結合(LEFT OUTER JOIN)、右外部結合(RIGHT OUTER JOIN)、完全外部結合(FULL OUTER JOIN)という3つの結合方法の違いについて詳しく解説します。それぞれの特徴と使い分けを理解することで、目的に応じた適切なデータ取得ができるようになります。左外部結合(LEFT OUTER JOIN)とは左外部結合は、左側のテーブルのすべての行を取得する結合方法です。結果としては、「内部結合(INNER JOIN)+ 左テーブルの一致しないすべての行」と同じものが得られます。なお、右側のテーブルで一致しなかったデータは結果に含まれ

  2. PythonとMySQLで2つのテーブルをLEFT JOIN(左結合)する方法を徹底解説

    SQLでは、2つのテーブル間の共通の列や、指定した条件に基づいてテーブルを結合(JOIN)することができます。SQLには内部結合(INNER JOIN)、左外部結合(LEFT JOIN)、右外部結合(RIGHT JOIN)など、さまざまな種類のJOINが用意されており、目的に応じて使い分けることが重要です。本記事では、その中でも「LEFT JOIN(左結合)」について詳しく解説します。LEFT JOINとは?LEFT JOINを使用すると、最初に指定したテーブル(左側のテーブル)のすべてのレコードが必ず結果に含まれます。右側のテーブルからは、結合条件に一致するレコードのみが左側のレコードと紐付