SQLでよく利用されるJOIN句の使用例

## はじめに
データベースクエリにおいて、JOIN句は異なるテーブル間でデータを結合するための不可欠なツールです。ここでは、よく使用される3つのSQL JOIN句の基本的な使用法を紹介し、新たなテーブルの作成手順も説明します。

## 1. 内部結合 (INNER JOIN)
INNER JOINは2つのテーブルから共通の値を持つ行を結合するために使用されます。これは、関連するデータを結合し、一致する行を取得するために使用されます。例えば、商品情報を価格情報と結合するケースを考えてみましょう。
```
SELECT  #4.以下のカラムを取得する
  products.product_name,
  products.category,
  prices.price
FROM　#1.productsテーブルと
  products
INNER JOIN #2.pricesテーブルが
  prices
ON　#3.product_idで一致する場合、結合して
  products.product_id = prices.product_id;
  
#以下イメージ
products テーブル:

| product_id | product_name | category    |
|------------|--------------|-------------|
| 1          | 商品A        | カテゴリ1   |
| 2          | 商品B        | カテゴリ2   |
| 3          | 商品C        | カテゴリ1   |

prices テーブル:

| price_id | product_id | price  |
|----------|------------|--------|
| 101      | 1          | 10.99  |
| 102      | 2          | 15.49  |
| 103      | 3          | 8.99   |

結合結果:

| product_name | category   | price  |
|--------------|------------|--------|
| 商品A        | カテゴリ1  | 10.99  |
| 商品B        | カテゴリ2  | 15.49  |
| 商品C        | カテゴリ1  | 8.99   |

```
## 2. 左外部結合 (LEFT JOIN)
左外部結合 (LEFT JOIN) は、左側のテーブルの全ての行を保持し、右側のテーブルとの共通の値を持つ行を結合します。共通の値が右側のテーブルに存在しない場合、欠損値が生成されます。顧客情報と注文情報を結合するケースを考えてみましょう。
```
#顧客情報、注文情報、注文詳細情報を結合し、顧客名、注文日時、注文金額を取得します
SELECT
  a.customer_name,   -- 顧客名
  b.order_date,      -- 注文日時
  c.order_amount     -- 注文金額
FROM
  customers AS a
LEFT JOIN
  orders AS b
ON
  a.customer_id = b.customer_id
LEFT JOIN
  order_details AS c
ON
  b.order_id = c.order_id;

#以下イメージ
customers テーブル (`a`):

| customer_id | customer_name |
|------------|---------------|
| 1          | 顧客A         |
| 2          | 顧客B         |
| 3          | 顧客C         |

orders テーブル (`b`):

| order_id | customer_id | order_date       |
|----------|------------|------------------|
| 101      | 1          | 2023-01-15 10:00 |
| 102      | 2          | 2023-01-16 12:30 |
| 103      | 1          | 2023-01-17 14:45 |

order_details テーブル (`c`):

| order_id | order_amount |
|----------|--------------|
| 101      | 50.00        |
| 102      | 30.00        |
| 103      | 75.00        |

結合結果:

| customer_name | order_date       | order_amount |
|---------------|------------------|--------------|
| 顧客A         | 2023-01-15 10:00 | 50.00        |
| 顧客B         | 2023-01-16 12:30 | 30.00        |
| 顧客C         |                  |              |
| 顧客A         | 2023-01-17 14:45 | 75.00        |

```
このクエリでは、customers（顧客情報） テーブルを a というエイリアスで参照し、orders（注文情報） テーブルを b というエイリアスで、order_details（注文詳細情報） テーブルを c というエイリアスで参照しています。エイリアス a, b, c はそれぞれのテーブルを略語として表し、クエリの可読性を向上させます。
## 3. 右外部結合 (RIGHT JOIN)
RIGHT JOINは左外部結合の逆で、右側のテーブルの全ての行を保持しながら、左側のテーブルとの共通の値を持つ行を結合します。共通の値が左側のテーブルに存在しない場合、欠損値が生成されます。以下は、商品(products)と在庫情報(inventory)を結合する例です。
```
SELECT
  products.product_name,
  inventory.stock_quantity
FROM
  products
RIGHT JOIN
  inventory
ON
  products.product_id = inventory.product_id;

#以下イメージ
#productsテーブル:
| product_id | product_name | category_id |
|------------|--------------|-------------|
| 1          | 商品A        | 101         |
| 2          | 商品B        | 102         |
| 3          | 商品C        | 101         |

inventoryテーブル:
| product_id | stock_quantity |
|------------|----------------|
| 1          | 50             |
| 2          | 30             |
| 3          | 75             |

結合結果:
| product_name | stock_quantity |
|--------------|----------------|
| 商品A        | 50             |
| 商品B        | 30             |
| 商品C        | 75             |

```
## 新たなテーブルの作成または置き換え
新しいテーブルを作成する場合、CREATE TABLE 文を使用します。またCREATEの後に OR REPLACEとつけると、既存のテーブルが存在する場合は新しいテーブルで置き換え、存在しない場合は新しいテーブルを作成することができます。
```
CREATE OR REPLACE TABLE new_table_name AS
SELECT
  columns
FROM
  table
```
## まとめ
この技術ブログでは、SQL JOIN句の基本的な使用法と、データベースクエリで異なるテーブルからデータを結合する方法について紹介しました。

INNER JOIN: 2つのテーブルから共通の値を持つ行を結合し、関連データを取得します。例えば、商品情報と価格情報を結合する場合などに使用します。

LEFT JOIN: 左側のテーブルの全ての行を保持し、右側のテーブルとの共通の値を持つ行を結合します。右側のテーブルに共通の値が存在しない場合、欠損値が生成されます。顧客情報と注文情報を結合する際に役立ちます。

RIGHT JOIN: LEFT JOINの逆で、右側のテーブルの全ての行を保持しながら、左側のテーブルとの共通の値を持つ行を結合します。共通の値が左側のテーブルに存在しない場合、欠損値が生成されます。商品、カテゴリ、在庫情報を結合する例を示しました。

これらのJOIN句を活用することで、異なるテーブルからデータを結合し、情報を効果的に取得できます。また、新しいテーブルを作成する方法についても触れ、データベースクエリのスキルを向上させる手助けとなるでしょう。