データベース初心者必見!入門編その7〜複数のテーブルを外部結合する〜
2015/07/29
はじめに
今回は、入門編その1、入門編その2、入門編その3、入門編その4、入門編その5、入門編その6の続きです。
今回は複数のテーブルからデータを外部結合して取得する方法について紹介いたします。
外部結合
内部結合では、他方のテーブルに対応する値が存在しない行は、結果セットには含まれませんでした。言い換えると、一致する行が存在する行のみが結果セットに含まれるのです。
例「ctg_id列」の値で内部結合した結果セット
※goodsテーブルの「革靴」の行が欠落しています。
※categoryテーブルの「文具」と「玩具」行が欠落しています。
外部結合は、欠落してしまったこれらの行も表示しようというものです。
外部結合では、LEFT OUTER JOIN句、RIGHT OUTER JOIN句の2つの構文を用います。これらの使い分けは、左側に記述されたテーブルの行をすべて残すか右側に記述されたテーブルの行を全て残すか、によって行います。
例として、goodsテーブルとcategoryテーブルをctg_id列を使って結合するときに、goodsテーブルの行をすべて場合のSQL文を記述してみましょう。
[shell]SELECT goods_name,ctg_name FROM goods
LEFT OUTER JOIN category USING (ctg_id)[/shell]
[shell]SELECT goods_name,ctg_name FROM goods
RIGHT OUTER JOIN category USING (ctg_id)[/shell]
実行結果
goodsテーブルの「革靴」の行が欠落せずに結果セットを取得することが出来ました。
補足「LEFT OUTER JOIN」
LEFT OUTER JOIN句は、LEFT JOINと記述しても同じ結果を得ることができます。
また、RIGHT OUTER JOIN句についてもRIGHT JOINと記述することができます。
実務などで既存のSQL文を読みとかなくてはならない場合には、OUTER JOINを省略した記述に遭遇する場合があるかもしれません。
知識として覚えてましょう。
補足「FULL OUTER JOIN」
結合にはLEFT OUTER JOIN句とRIGHT OUTER JOIN句の他にFULL OUTER JOIN句があります。
FULL OUTER JOIN句は左右両方の行を全て残すというものです。
記述の方ほうは次のとおりになります。
[shell]SELECT * FROM goods FULL OUTER JOIN category USING (ctg_id)[/shell]
残念ながらMySQL5.1ではサポートされていませんが、実用性のあるSQL文なので、覚えておきましょう。
他のRDBMSを使用するときに役立つはずです。
また、MySQLでFULL OUTER JOIN句を使わずに同じ結果セットを取得するには、UNION演算子を使って次のようにSQL文を記述します。
[shell]SELECT gds_name,ctg_name FROM goods
LEFT OUTER JOIN category USING (ctg_id)
UNION SELECT gds_name,ctg_name FROM goods
RIGHT OUTER JOIN category USING (ctg_id)[/shell]
UNION演算子は集合演算子と呼ばれます。集合演算子はSELECT文の結果を集合とみなして、その集合を演算するものです。高度なSQL文になっています。
さいごに
今回は複数のテーブルからデータを取得する方法について紹介いたしました。
次回は、3つ以上のテーブルからデータを取得する方法や、テーブルの結合と選択を同時に行う方法について紹介いたします。