データベース操作で必須となる『テーブル結合』の挙動を把握したいと思います。
概要
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つの情報を抜き出して表示した、ということですね。
FROM
と JOIN
で結合するテーブルを選択し、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』を追加することで結合するテーブルを増やし、最後に取り出したい中身を出力しています。
以上です。