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」という条件を加えることで、右側のテーブルに該当データが存在しない行だけを取り出すことができるのです。
この手法は、データの整合性チェックや、同期漏れのレコード検出など、実務のさまざまなシーンで活用できるので、ぜひ覚えておきましょう。
-
左外部結合・右外部結合・完全外部結合の違いを徹底解説
はじめにこの記事では、SQLにおける左外部結合(LEFT OUTER JOIN)、右外部結合(RIGHT OUTER JOIN)、完全外部結合(FULL OUTER JOIN)という3つの結合方法の違いについて詳しく解説します。それぞれの特徴と使い分けを理解することで、目的に応じた適切なデータ取得ができるようになります。左外部結合(LEFT OUTER JOIN)とは左外部結合は、左側のテーブルのすべての行を取得する結合方法です。結果としては、「内部結合(INNER JOIN)+ 左テーブルの一致しないすべての行」と同じものが得られます。なお、右側のテーブルで一致しなかったデータは結果に含まれ
-
PythonとMySQLで2つのテーブルをLEFT JOIN(左結合)する方法を徹底解説
SQLでは、2つのテーブル間の共通の列や、指定した条件に基づいてテーブルを結合(JOIN)することができます。SQLには内部結合(INNER JOIN)、左外部結合(LEFT JOIN)、右外部結合(RIGHT JOIN)など、さまざまな種類のJOINが用意されており、目的に応じて使い分けることが重要です。本記事では、その中でも「LEFT JOIN(左結合)」について詳しく解説します。LEFT JOINとは?LEFT JOINを使用すると、最初に指定したテーブル(左側のテーブル)のすべてのレコードが必ず結果に含まれます。右側のテーブルからは、結合条件に一致するレコードのみが左側のレコードと紐付