SQL の基本 | DML: データ操作言語 | JOIN

JOIN は、テーブル同士を結合するときに使用する。

SQL にある JOIN の主な種類は次のとおりである。

  • (INNER) JOIN: 2 つのテーブルで値が一致するレコードを返す。
  • LEFT (OUTER) JOIN: 左側のテーブルのすべてのレコードと、右側のテーブルで一致するレコードを返す。
  • RIGHT (OUTER) JOIN: 右側のテーブルのすべてのレコードと、左側のテーブルで一致するレコードを返す。
  • FULL (OUTER) JOIN: 左側または右側のテーブルのすべてのレコードを返す。

SQL JOINS

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

SQL JOINS

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 になる。