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