【PHP日記】

自分の知識不足を悟った末、なるべく1日一回、Webに関する知識を書いていくだけのブログ。

SQLの『JOIN ON』の挙動を把握する 【26日目】

データベース操作で必須となる『テーブル結合』の挙動を把握したいと思います。


概要

SQLにおいてテーブル同士を結合するのが『JOIN』コマンドです。

基本的な使い方としては、同じ『カラム名』を持つテーブルを2つ以上選択し、JOINコマンドで結合します。

すると、そのカラム名を基準に作成された新しいテーブルが返されます。



各テーブルの仕様

【product_tb】

+------------+---------------+-------+-------+--------------------------+
| product_id | product_name  | price | stock | detail                   |
+------------+---------------+-------+-------+--------------------------+
| 1          | りんご        | 120   | 0     | とてもおいしいりんごです。|
| 2          | みかん        | 100   | 0     | とてもおいしいみかんです。|
| 3          | もも          | 200   | 0     | とてもおいしいももです。  |
| 4          | ぶどう        | 250   | 0     | とてもおいしいぶどうです。|
| 5          | さくらんぼ    | 300   | 0     | とてもおいしいさくらんぼです。|
+------------+---------------+-------+-------+--------------------------+


【order_tb】

+----------+---------------------+-------------+
| order_id | order_date          | customer_id |
+----------+---------------------+-------------+
|        1 | 2016-08-01 00:00:00 |           2 |
|        2 | 2016-07-01 00:00:00 |           2 |
|        3 | 2016-07-01 00:00:00 |           3 |
|        4 | 2016-06-01 00:00:00 |           1 |
|        5 | 2016-05-01 00:00:00 |           2 |
+----------+---------------------+-------------+


【order_detail_tb】

+-----------------+----------+------------+---------------+
| order_detail_id | order_id | product_id | product_count |
+-----------------+----------+------------+---------------+
|               1 |        1 |          5 |             1 |
|               2 |        1 |          4 |             2 |
|               3 |        1 |          2 |            10 |
|               4 |        2 |          1 |             3 |
|               5 |        2 |          2 |             4 |
|               6 |        3 |          1 |             2 |
|               7 |        3 |          3 |             4 |
|               8 |        3 |          4 |             3 |
|               9 |        3 |          5 |             2 |
|              10 |        4 |          2 |             3 |
|              11 |        4 |          1 |             5 |
|              12 |        5 |          5 |             7 |
+-----------------+----------+------------+---------------+


【customer_tb】

+-------------+---------------+--------------+--------------+
| customer_id | customer_name | customer_age | address      |
+-------------+---------------+--------------+--------------+
|           1 | 田中太郎      |           37 | 板橋区       |
|           2 | 伊藤和彦      |           33 | 立川市       |
|           3 | 五味隆      |           31 | 千代田区     |
+-------------+---------------+--------------+--------------+



実際にテーブルを結合していく

SELECT
   ord.order_id,
   cus.customer_name
FROM
   order_tb ord
JOIN
  customer_tb cus
ON
  ord.customer_id = cus.customer_id;

これを実行するとこうなります。

+----------+---------------+
| order_id | customer_name |
+----------+---------------+
|        1 | 伊藤和彦      |
|        2 | 伊藤和彦      |
|        3 | 五味隆       |
|        4 | 田中太郎      |
|        5 | 伊藤和彦      |
+----------+---------------+

これは、『customer_id』というカラムを基準にテーブルを結合した上で、『order_id』と『customer_name』という2つの情報を抜き出して表示した、ということですね。

FROMJOIN で結合するテーブルを選択し、ON で基準となるカラム名を選択しています。この時、エイリアスを作成することで、SELECT文の中で簡潔した書き方ができるようにされています。

ちなみに、通常のJOIN句の場合は、中身の『order_tb』と『customer_tb』順番がどちらでも(入れ替わっても)問題がない場合が多いです。



3つ以上のテーブルを結合する

3つ以上のテーブルを結合した上で、必要な情報を取り出す場合はこうなります。

SELECT
  ord.order_id,
  pro.product_id,
  pro.product_name,
  pro.price,
  order_detail.product_count,
  pro.price * order_detail.product_count AS sales
FROM
  order_tb ord
JOIN
  order_detail_tb order_detail
ON
  ord.order_id = order_detail.order_id
JOIN
  product_tb pro
ON
  order_detail.product_id = pro.product_id;

この結果はこうなります。

+----------+------------+-----------------+-------+---------------+-------+
| order_id | product_id | product_name    | price | product_count | sales |
+----------+------------+-----------------+-------+---------------+-------+
|        1 |          5 | さくらんぼ      |   300 |             1 |   300 |
|        1 |          4 | ぶどう          |   250 |             2 |   500 |
|        1 |          2 | みかん          |   100 |            10 |  1000 |
|        2 |          1 | りんご          |   120 |             3 |   360 |
|        2 |          2 | みかん          |   100 |             4 |   400 |
|        3 |          1 | りんご          |   120 |             2 |   240 |
|        3 |          3 | もも            |   200 |             4 |   800 |
|        3 |          4 | ぶどう          |   250 |             3 |   750 |
|        3 |          5 | さくらんぼ      |   300 |             2 |   600 |
|        4 |          2 | みかん          |   100 |             3 |   300 |
|        4 |          1 | りんご          |   120 |             5 |   600 |
|        5 |          5 | さくらんぼ      |   300 |             7 |  2100 |
+----------+------------+-----------------+-------+---------------+-------+

やっていることは同じで、ON句の後に再び『JOIN』を追加することで結合するテーブルを増やし、最後に取り出したい中身を出力しています。



以上です。