SQL Joins
概要

Inner Join
AとBの共通データ。
SELECT *
FROM A
INNER JOIN B ON A.KEY = B.KEYLeft Join
Aの部分データのみ(Bとの交差を除く)。
SELECT *
FROM A
LEFT JOIN B ON A.KEY = B.KEY
WHERE B.KEY IS NULLRight Join
Bの部分データのみ(Aとの交差を除く)。
SELECT *
FROM A
RIGHT JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULLFull Outer Join
すべてのデータ(A ∪ B)
SELECT *
FROM A
FULL OUTER JOIN B ON A.KEY = B.KEYAまたはBのみのデータ(交差を除く)
SELECT *
FROM A
FULL OUTER JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL OR B.KEY IS NULLNatural Join
同じ列名で自動的に JOIN を行い、ON 条件を明示的に指定する必要がない。
構文
SELECT *
FROM A
NATURAL JOIN B例
employee と department テーブルを使用(共通列:DEPARTMENT_ID):
SELECT e.FULL_NAME, d.DEPARTMENT_NAME
FROM employee e
NATURAL JOIN department dInner Join の等価な書き方
SELECT e.FULL_NAME, d.DEPARTMENT_NAME
FROM employee e
INNER JOIN department d ON e.DEPARTMENT_ID = d.DEPARTMENT_IDNatural Join は同じ名前のすべての列を自動的にマッチさせるため、予期しない結果になる可能性がある。ON 条件を明示的に使用することを推奨する。
デモテーブル
department テーブル
| DEPARTMENT_ID | DEPARTMENT_NAME |
|---|---|
| 1 | Executive |
| 2 | HR |
| 3 | Sales |
| 4 | Development |
| 5 | Support |
| 6 | Research |
employee テーブル
| EMPLOYEE_ID | FULL_NAME | DEPARTMENT_ID | ROLE | MANAGER_ID |
|---|---|---|---|---|
| 1 | John Smith | 1 | CEO | (null) |
| 2 | Sarah Goodes | 1 | CFO | 1 |
| 3 | Wayne Ablett | 1 | CIO | 1 |
| 4 | Michelle Carey | 2 | HR Manager | 1 |
| 5 | Chris Matthews | 3 | Sales Manager | 2 |
| 6 | Andrew Judd | 4 | Development Manager | 3 |
| 7 | Danielle McLeod | 5 | Support Manager | 3 |
| 8 | Matthew Swan | 2 | HR Representative | 4 |
| 9 | Stephanie Richardson | 2 | Salesperson | 5 |
| 10 | Tony Grant | 3 | Salesperson | 5 |
| 11 | Jenna Lockett | 4 | Front-End Developer | 6 |
| 12 | Michael Dunstall | 4 | Back-End Developer | 6 |
| 13 | Jane Voss | 4 | Back-End Developer | 6 |
| 14 | Anthony Hird | (null) | Support | 7 |
| 15 | Natalie Rocca | 5 | Support | 7 |
location テーブル
| LOCATION_ID | OFFICE_NAME | CITY | COUNTRY |
|---|---|---|---|
| 1 | Headquarters | New York | USA |
| 2 | Main Office | London | UK |
| 3 | Sales Office | Tokyo | Japan |
| 4 | Development Office | San Francisco | USA |
| 5 | Support Office | Sydney | Australia |
| 6 | Research Office | Berlin | Germany |
3つのテーブルを結合
複数テーブルの関連クエリで、employee、department、location テーブルを結合する。
シナリオ
従業員の名前、所属部門、オフィスの場所を照会する。
例
SELECT
e.FULL_NAME,
e.ROLE,
d.DEPARTMENT_NAME,
l.OFFICE_NAME,
l.CITY,
l.COUNTRY
FROM employee e
INNER JOIN department d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
INNER JOIN location l ON d.DEPARTMENT_ID = l.LOCATION_ID結果例
| FULL_NAME | ROLE | DEPARTMENT_NAME | OFFICE_NAME | CITY | COUNTRY |
|---|---|---|---|---|---|
| John Smith | CEO | Executive | Headquarters | New York | USA |
| Sarah Goodes | CFO | Executive | Headquarters | New York | USA |
| Wayne Ablett | CIO | Executive | Headquarters | New York | USA |
| Michelle Carey | HR Manager | HR | Main Office | London | UK |
| Matthew Swan | HR Representative | HR | Main Office | London | UK |
| Chris Matthews | Sales Manager | Sales | Sales Office | Tokyo | Japan |
| Tony Grant | Salesperson | Sales | Sales Office | Tokyo | Japan |
LEFT JOIN の使用
部門や場所がない従業員も含める場合:
SELECT
e.FULL_NAME,
e.ROLE,
d.DEPARTMENT_NAME,
l.OFFICE_NAME
FROM employee e
LEFT JOIN department d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
LEFT JOIN location l ON d.DEPARTMENT_ID = l.LOCATION_IDLEFT JOIN を使用する場合、マッチしない列は NULL として表示される。例えば Anthony Hird の
DEPARTMENT_ID は NULL なので、DEPARTMENT_NAME と OFFICE_NAME は両方とも NULL になる。