SQL の基本 | DML: データ操作言語 | JOIN
JOIN は、テーブル同士を結合するときに使用する。
SQL にある JOIN の主な種類は次のとおりである。
- (INNER) JOIN: 2 つのテーブルで値が一致するレコードを返す。
- LEFT (OUTER) JOIN: 左側のテーブルのすべてのレコードと、右側のテーブルで一致するレコードを返す。
- RIGHT (OUTER) JOIN: 右側のテーブルのすべてのレコードと、左側のテーブルで一致するレコードを返す。
- FULL (OUTER) JOIN: 左側または右側のテーブルのすべてのレコードを返す。

追加で、次のように返される値を調整することもできる。

JOIN 構文
INNER JOIN
SELECT column_name(s)
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
LEFT (OUTER) JOIN
SELECT column_name(s)
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
RIGHT (OUTER) JOIN
SELECT column_name(s)
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
FULL (OUTER) JOIN
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
INNER JOIN の例
SQL の結合 (JOIN) の例である。
store_information テーブル
| store_name | sales | txn_date |
|---|---|---|
| Los Angeles | 1500 | Jan-05-2018 |
| San Diego | 250 | Jan-07-2018 |
| Los Angeles | 300 | Jan-08-2018 |
| Boston | 700 | Jan-08-2018 |
geography テーブル
| region_name | store_name |
|---|---|
| East | Boston |
| East | New York |
| West | Los Angeles |
| West | San Diego |
内部結合 (inner join) は、2 つのテーブルで一致する値がある場合にのみ、そのデータを取得する。
地域 (region_name) ごとの売上 (Sales) を調べる。geography テーブルには各地域の店舗が、store_information テーブルには各店舗の売上が示されている。地域別売上を確認するには、この 2 つのテーブルのデータを結合する。詳しく見ると、store_name フィールドによってこの 2 つのテーブルを結合できることが分かる。
SELECT A1.region_name REGION, SUM(A2.sales) SALES
FROM geography A1 JOIN store_information A2 ON A1.store_name = A2.store_name
GROUP BY A1.region_name;
または:
SELECT A1.region_name REGION, SUM(A2.sales) SALES
FROM geography A1, store_information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name;
結果は次のとおりである。
| REGION | SALES |
|---|---|
| East | 700 |
| West | 2050 |
最初の行では、SQL を使用して 2 つのフィールドを選択している。1 つ目は geography テーブルの region_name フィールド、別名 REGION であり、2 つ目は store_information テーブルの sales フィールド、別名 SALES である。ここでは Geography テーブルのエイリアスを A1、store_information テーブルのエイリアスを A2 としている。テーブルエイリアスを使用しない場合、最初の行は次のようになる。
SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES
見て分かるように、テーブル名をすべて表示すると長く複雑になる。テーブルエイリアスを使用すると SQL 文が分かりやすくなり、特に複数のテーブルを含む SQL 文ではさらに有用である。
続いて 2 行目の FROM 句を見ると、geography テーブルの store_name フィールドと store_information テーブルの store_name フィールドを JOIN で接続している。
OUTER JOIN の例
一方のテーブルにあるデータ値が、もう一方のテーブルにまったく存在しない場合は OUTER JOIN (外部結合) を使用する。
外部結合の構文はデータベースによって異なる場合がある。たとえば Oracle では、テーブルのデータが必要であることを示すために、WHERE 句で読み込まれたテーブルの後に (+) を置く。
各店舗の売上を検索する。内部結合を使用すると、store_information テーブルに存在しない New York 店舗のデータが漏れてしまう。そのような場合は外部結合を使用する。
ここで使用する Oracle の外部結合は次のとおりである。
SELECT A1.store_name, SUM(A2.sales) SALES
FROM geography A1, store_information A2
WHERE A1.store_name = A2.store_name (+)
GROUP BY A1.store_name;
結果は次のとおりである。
| store_name | SALES |
|---|---|
| Boston | 700 |
| New York | |
| Los Angeles | 1800 |
| San Diego | 250 |
2 つ目のテーブルに該当データがない場合、SQL では NULL 値が入る。この例では New York が store_information テーブルに存在しないため、その SALES フィールドは NULL になる。