SQLiteはシンプルで軽量ながらも高機能なリレーショナルデータベースです。特に複数のテーブルから関連データをまとめて取得したいときに使われる「JOIN」構文は、データベース操作の中でも非常に重要な技術です。この記事では、SQLiteで使える代表的なJOIN構文「INNER JOIN」と「LEFT JOIN」について、基本から応用までをわかりやすく解説していきます。JOINの違いや実用例を通じて、あなたも複雑なデータの取り扱いに自信が持てるようになるでしょう。
JOINとは、複数のテーブルを条件に基づいて結合し、一つの結果セットとして取得するSQL文です。たとえば、顧客テーブルと注文テーブルがあった場合、顧客の名前とそれぞれの注文情報を組み合わせて表示したいときにJOINを使います。
SQLiteでは以下のようなJOINが使用できます。
この記事では、もっとも使用頻度が高いINNER JOINとLEFT JOINにフォーカスして説明します。
説明に入る前に、以下のような二つのテーブルを使うことを想定します。
customer_id | name |
---|---|
1 | 山田太郎 |
2 | 鈴木花子 |
3 | 佐藤次郎 |
order_id | customer_id | product |
---|---|---|
1 | 1 | ノートPC |
2 | 1 | マウス |
3 | 2 | スマホ |
SELECT customers.name, orders.product
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
INNER JOINは、両方のテーブルに共通するデータのみを結合して取得します。上記のクエリでは、「顧客テーブル」と「注文テーブル」のcustomer_idが一致する行だけが表示されます。
name | product |
---|---|
山田太郎 | ノートPC |
山田太郎 | マウス |
鈴木花子 | スマホ |
「佐藤次郎」は注文していないため、表示されません。
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に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を書く場合には、特に有効な書き方です。
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は、テーブル同士の関係性を表現し、必要な情報をまとめて取得するために非常に強力な手段です。INNER JOINは「共通データの取得」に、LEFT JOINは「すべてのデータと関連情報の取得」に適しています。それぞれの特徴を理解して、目的に応じて使い分けることが重要です。
JOINをマスターすれば、複雑なデータベースのクエリも自在に扱えるようになります。ぜひ今回紹介した内容を実際に試して、理解を深めていってください。