0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

INNER JOIN と OUTER JOIN【初心者から中級者へ】

Posted at

SQLではデータを取得するときに自分が望む形で取得できない場合がしばしばあります。
JOINを使えば複数のテーブルを結合してほしい形でのデータ取得が可能になります。
初心者のうちは「INNER JOIN」と「OUTER JOIN」の違いが分からず混乱します。
私もそうでした…

この記事では、INNER JOIN と OUTER JOIN の違いを解説しつつ、実務での使い方や注意点も紹介します。
脱初心者のためにJOINについて理解を深めましょう。

JOINとは?

JOINは取得したいデータに関連する複数のテーブルからデータを整形して取得するために使用します。
JOINには大きく分けて2種類あります。

  • INNER JOIN
  • OUTER JOIN
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
    • FULL OUTER JOIN

INNER JOIN:共通するデータだけを取得する

INNER JOINは、両方のテーブルで条件に合致するデータだけを取得します。
まずは基本構文を確認しましょう。

基本構文
SELECT column1, column2  
FROM table1  
INNER JOIN table2  
ON table1.common_column = table2.common_column;

具体例を用いて考えましょう。
以下2つのテーブルを考えます。
employees(社員テーブル)

employee_id name department_id
1 Tanaka 101
2 Suzuki 102
3 Yamada NULL

departments(部署テーブル)

department_id department_name
101 Sales
102 HR
103 Marketing

INNERJOINを使ってみましょう。

INNER JOIN
SELECT employees.name, departments.department_name  
FROM employees  
INNER JOIN departments  
ON employees.department_id = departments.department_id;

結果は以下のようになります。

name department_name
Tanaka Sales
Suzuki HR

Yamadaはdepartment_idが一致しないので出力されません。
共通しているものしか抽出されないのです。

OUTER JOIN:不足しているデータも含めて取得する

OUTER JOINは条件に合わないデータも取得できるのが特徴です。
種類ごとに動作が異なります。

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

LEFT OUTER JON:左のテーブルの全データ取得する

基本構文
SELECT column1, column2  
FROM table1  
LEFT OUTER JOIN table2  
ON table1.common_column = table2.common_column;

左側(table1)のデータをすべて取得し、条件に合わない場合は右側(table2)にNULLを挿入します。
具体例で確認しましょう。

基本構文
SELECT employees.name, departments.department_name  
FROM employees  
LEFT OUTER JOIN departments  
ON employees.department_id = departments.department_id;

このSQLに対する結果はこうなります。

name department_name
Tanaka Sales
Suzuki HR
Yamada NULL

理解できましたか?
同じ要領でRIGHT OUTER JOINを確認しましょう。

RIGHT OUTER JOIN:右のテーブルの全データを取得

基本構文
SELECT column1, column2  
FROM table1  
RIGHT OUTER JOIN table2  
ON table1.common_column = table2.common_column;

RIGHT OUTER JOINは右側(table2)のデータをすべて取得し、条件に合わない場合は左側(table1)にNULLを挿入します。

こちらも具体例で確認しましょう。

SELECT employees.name, departments.department_name  
FROM employees  
RIGHT OUTER JOIN departments  
ON employees.department_id = departments.department_id;

結果はこちらになります。

name department_name
Tanaka Sales
Suzuki HR
NULL Marketing

FULL OUTER JOIN:両方のテーブルの全データを取得

基本構文
SELECT column1, column2  
FROM table1  
FULL OUTER JOIN table2  
ON table1.common_column = table2.common_column;

FULL OUTER JOINでは両方のテーブルのすべてのデータを取得します。
条件に合わない場合はNULLを挿入します。

では具体例を見てみましょう。

基本構文
SELECT 
    employees.employee_id, 
    employees.name AS employee_name, 
    employees.department_id AS emp_department_id, 
    departments.department_name 
FROM 
    employees 
FULL OUTER JOIN 
    departments 
ON 
    employees.department_id = departments.department_id;

結果は下のようになります。

employee_id employee_name emp_department_id department_name
1 Tanaka 101 Sales
2 Suzuki 102 HR
3 Yamada NULL NULL
NULL NULL 103 Marketing

実務で役立つJOINの考え方

  • INNER JOINはデフォルト:条件に一致しないデータは基本的に不要であることが多いので、INNER JOINをデフォルトとして考えましょう。
  • OUTER JOINのOUTER省略は非推奨RIGHT JOINLEFT JOINといった書き方も可能です。しかし、内部結合(INNER JOIN)に対して外部結合(OUTER JOIN)であることを明示したいので省略することはお勧めしません。
  • データ量に注意:JOINを使うと結合後のデータ量が増加することがあるので、取得するカラムや条件を適切に設定しましょう。

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?