SQLiteはシンプルで軽量ながらも高機能なリレーショナルデータベースです。特に複数のテーブルから関連データをまとめて取得したいときに使われる「JOIN」構文は、データベース操作の中でも非常に重要な技術です。この記事では、SQLiteで使える代表的なJOIN構文「INNER JOIN」と「LEFT JOIN」について、基本から応用までをわかりやすく解説していきます。JOINの違いや実用例を通じて、あなたも複雑なデータの取り扱いに自信が持てるようになるでしょう。
JOINとは何か?
JOINとは、複数のテーブルを条件に基づいて結合し、一つの結果セットとして取得するSQL文です。たとえば、顧客テーブルと注文テーブルがあった場合、顧客の名前とそれぞれの注文情報を組み合わせて表示したいときにJOINを使います。
SQLiteでは以下のようなJOINが使用できます。
- INNER JOIN(内部結合)
- LEFT JOIN(左外部結合)
- RIGHT JOIN(右外部結合)※SQLiteでは明示的には非対応、LEFT JOINで代用可能
- CROSS JOIN(直積)
この記事では、もっとも使用頻度が高いINNER JOINとLEFT JOINにフォーカスして説明します。
テーブルの準備
説明に入る前に、以下のような二つのテーブルを使うことを想定します。
customers(顧客テーブル)
customer_id | name |
---|---|
1 | 山田太郎 |
2 | 鈴木花子 |
3 | 佐藤次郎 |
orders(注文テーブル)
order_id | customer_id | product |
---|---|---|
1 | 1 | ノートPC |
2 | 1 | マウス |
3 | 2 | スマホ |
INNER JOINの使い方
基本構文
SELECT customers.name, orders.product
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
解説
INNER JOINは、両方のテーブルに共通するデータのみを結合して取得します。上記のクエリでは、「顧客テーブル」と「注文テーブル」のcustomer_idが一致する行だけが表示されます。
実行結果
name | product |
---|---|
山田太郎 | ノートPC |
山田太郎 | マウス |
鈴木花子 | スマホ |
「佐藤次郎」は注文していないため、表示されません。
LEFT JOINの使い方
基本構文
SELECT customers.name, orders.product
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
解説
LEFT JOINは、左側(この場合はcustomers)のテーブルにあるすべてのデータを取得し、右側のテーブルに一致するデータがない場合はNULLを返します。
実行結果
name | product |
---|---|
山田太郎 | ノートPC |
山田太郎 | マウス |
鈴木花子 | スマホ |
佐藤次郎 | NULL |
INNER JOINと違い、「佐藤次郎」も結果に含まれている点が特徴です。
条件付きでJOINを使う
JOINにWHERE句を加えることで、さらに絞り込みが可能です。
SELECT customers.name, orders.product
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id
WHERE orders.product IS NOT NULL;
このクエリは、LEFT JOINの結果からproduct
がNULLでない行だけを表示します。つまり、「INNER JOINと同じ結果」になります。
テーブルに別名(エイリアス)をつけて書く
JOIN文は長くなりがちなので、テーブル名にエイリアス(短縮名)を使うと見やすくなります。
SELECT c.name, o.product
FROM customers AS c
LEFT JOIN orders AS o
ON c.customer_id = o.customer_id;
複雑なSQLを書く場合には、特に有効な書き方です。
実務で使えるJOINの応用例
例:特定の顧客の注文履歴を取得する
SELECT c.name, o.product
FROM customers AS c
INNER JOIN orders AS o
ON c.customer_id = o.customer_id
WHERE c.name = '山田太郎';
このようにJOINとWHERE句を組み合わせることで、条件に合った絞り込みが可能になります。
SQLiteでJOINを使うときの注意点
- 結合条件が明確でないと重複や膨大なデータになる
→ ON句で結合条件を必ず指定しましょう。 - LEFT JOINでNULLを処理する場合はIS NULL / IS NOT NULLを使う
→ = NULLでは正しく比較されません。 - インデックスを使うとパフォーマンスが改善する
→ 大量データをJOINする場合はインデックスの利用を検討しましょう。
まとめ
SQLiteでのJOINは、テーブル同士の関係性を表現し、必要な情報をまとめて取得するために非常に強力な手段です。INNER JOINは「共通データの取得」に、LEFT JOINは「すべてのデータと関連情報の取得」に適しています。それぞれの特徴を理解して、目的に応じて使い分けることが重要です。
JOINをマスターすれば、複雑なデータベースのクエリも自在に扱えるようになります。ぜひ今回紹介した内容を実際に試して、理解を深めていってください。