INNER JOIN は、どういう時に使用するのですか？ INNER JOIN でしか出来ないことはありますか？


これまで INNER JOIN を一度も使用したことはないのですが、 INNER JOIN は、どういう時に使用するのですか？  
INNER JOIN を使用しないと、出来ない処理はありますか？

* * *

INNER JOIN の説明を読むと、両テーブルのカラム値が一致するデータだけ取得する、と書いてあるのですが、  
OUTER JOIN で、両テーブルのカラム値が一致するという条件を書けば良いだけだと思うのですが、そういう問題ではない？？

例えばですが、OUTER JOIN 後に、条件追記することで INNER JOIN と同じ結果を取得できますか？  
実際に実行するかどうかは別として、基本的な考え方としては下記認識で合っていますか？  
・INNER JOIN 取得結果から、OUTER JOIN 取得結果を 得ることは不可  
・OUTER JOIN 取得結果から、(条件追記することで)INNER JOIN 取得結果を 得ることは可




> ・INNER JOIN 取得結果から、OUTER JOIN 取得結果を 得ることは不可

はい、不可能です。

> ・OUTER JOIN 取得結果から、(条件追記することで)INNER JOIN 取得結果を 得ることは可

はい、可能です。

* * *

# 詳細

`OUTER JOIN` は3つの種類があります。

  * `LEFT OUTER JOIN` （左外部結合）
  * `RIGHT OUTER JOIN` （右外部結合）
  * `FULL OUTER JOIN` （完全外部結合）

`LEFT JOIN` のように、`OUTER` を省略して書いても構いません。  
逆に、`LEFT/RIGHT/FULL` を省略して `OUTER JOIN` と書くことはできません。  
（ちなみに、`FROM A, B` のように書いた場合、`FROM A CROSS JOIN B` 相当になります）

質問者の `OUTER JOIN` がどれを指すか不明ですが、質問内容から `FULL OUTER JOIN` と仮定します。

以下のテーブルを使って、例を挙げます。

[code]

    Aテーブル  Bテーブル
    +------+   +------+
    | ID   |   | ID   |
    +------+   +------+
    | 1    |   | 1    |
    | 2    |   | 3    |
    +------+   +------+
    
[/code]

## 例1: `FROM A INNER JOIN B ON A.ID = B.ID`

AテーブルとBテーブルの両方に同じIDがある行のみ取得できます。

[code]

    +------+------+
    | A.ID | B.ID |
    +------+------+
    |    1 |    1 |
    +------+------+
    
[/code]

## 例2： `FROM A FULL OUTER JOIN B ON A.ID = B.ID`

AテーブルまたはBテーブルにある行が取得できます。

[code]

    +------+------+
    | A.ID | B.ID |
    +------+------+
    |    1 |    1 |
    |    2 | null |
    | null |    3 |
    +------+------+
    
[/code]

## 例3： `FROM A FULL OUTER JOIN B ON A.ID = B.ID WHERE A.ID = B.ID`

例2のテーブルができあがった後に、`A.ID = B.ID` となる行を抽出しています。

[code]

    +------+------+
    | A.ID | B.ID |
    +------+------+
    |    1 |    1 |
    +------+------+
    
[/code]

つまり、`INNER JOIN` と同じ結果になります。  
（データベース内部では、大体の場合 `INNER JOIN` と同じ処理に変換されます）

## 使い分け

適切に JOIN を使い分けることで、 **`ON` 句に結合条件、`WHERE` 句に抽出条件** を書けます。

例えば、`A.ID = B.ID` は抽出条件ではなく結合条件です。  
この場合、`INNER JOIN` を使って結合条件を `ON` 句に書いた方が、 **二つのテーブルをIDで結合している**
ということが一目でわかります。

逆に、`FULL OUTER JOIN` を使って `WHERE`
句に結合条件を書くと、抽出条件の中に結合条件が埋もれてしまうため、二つのテーブルの関係がぱっと見でわからなくなります。

## 参考

[7.2. テーブル式 - 第7章 問い合わせ - PostgreSQL
12.0文書](https://www.postgresql.jp/document/12/html/queries-table-
expressions.html#QUERIES-JOIN)




> ・INNER JOIN 取得結果から、OUTER JOIN 取得結果を 得ることは不可

はい、不可能です。

> ・OUTER JOIN 取得結果から、(条件追記することで)INNER JOIN 取得結果を 得ることは可

はい、可能です。

* * *

# 詳細

`OUTER JOIN` は3つの種類があります。

  * `LEFT OUTER JOIN` （左外部結合）
  * `RIGHT OUTER JOIN` （右外部結合）
  * `FULL OUTER JOIN` （完全外部結合）

`LEFT JOIN` のように、`OUTER` を省略して書いても構いません。  
逆に、`LEFT/RIGHT/FULL` を省略して `OUTER JOIN` と書くことはできません。  
（ちなみに、`FROM A, B` のように書いた場合、`FROM A CROSS JOIN B` 相当になります）

質問者の `OUTER JOIN` がどれを指すか不明ですが、質問内容から `FULL OUTER JOIN` と仮定します。

以下のテーブルを使って、例を挙げます。

[code]

    Aテーブル  Bテーブル
    +------+   +------+
    | ID   |   | ID   |
    +------+   +------+
    | 1    |   | 1    |
    | 2    |   | 3    |
    +------+   +------+
    
[/code]

## 例1: `FROM A INNER JOIN B ON A.ID = B.ID`

AテーブルとBテーブルの両方に同じIDがある行のみ取得できます。

[code]

    +------+------+
    | A.ID | B.ID |
    +------+------+
    |    1 |    1 |
    +------+------+
    
[/code]

## 例2： `FROM A FULL OUTER JOIN B ON A.ID = B.ID`

AテーブルまたはBテーブルにある行が取得できます。

[code]

    +------+------+
    | A.ID | B.ID |
    +------+------+
    |    1 |    1 |
    |    2 | null |
    | null |    3 |
    +------+------+
    
[/code]

## 例3： `FROM A FULL OUTER JOIN B ON A.ID = B.ID WHERE A.ID = B.ID`

例2のテーブルができあがった後に、`A.ID = B.ID` となる行を抽出しています。

[code]

    +------+------+
    | A.ID | B.ID |
    +------+------+
    |    1 |    1 |
    +------+------+
    
[/code]

つまり、`INNER JOIN` と同じ結果になります。  
（データベース内部では、大体の場合 `INNER JOIN` と同じ処理に変換されます）

## 使い分け

適切に JOIN を使い分けることで、 **`ON` 句に結合条件、`WHERE` 句に抽出条件** を書けます。

例えば、`A.ID = B.ID` は抽出条件ではなく結合条件です。  
この場合、`INNER JOIN` を使って結合条件を `ON` 句に書いた方が、 **二つのテーブルをIDで結合している**
ということが一目でわかります。

逆に、`FULL OUTER JOIN` を使って `WHERE`
句に結合条件を書くと、抽出条件の中に結合条件が埋もれてしまうため、二つのテーブルの関係がぱっと見でわからなくなります。

## 参考

[7.2. テーブル式 - 第7章 問い合わせ - PostgreSQL
12.0文書](https://www.postgresql.jp/document/12/html/queries-table-
expressions.html#QUERIES-JOIN)

