データベース初心者必見!入門編その7〜複数のテーブルを外部結合する〜

2015/07/29

はじめに

今回は、入門編その1入門編その2入門編その3入門編その4入門編その5入門編その6の続きです。

今回は複数のテーブルからデータを外部結合して取得する方法について紹介いたします。

外部結合

内部結合では、他方のテーブルに対応する値が存在しない行は、結果セットには含まれませんでした。言い換えると、一致する行が存在する行のみが結果セットに含まれるのです。

例「ctg_id列」の値で内部結合した結果セット

hyou5

※goodsテーブルの「革靴」の行が欠落しています。

※categoryテーブルの「文具」と「玩具」行が欠落しています。

外部結合は、欠落してしまったこれらの行も表示しようというものです。

外部結合では、LEFT OUTER JOIN句、RIGHT OUTER JOIN句の2つの構文を用います。これらの使い分けは、左側に記述されたテーブルの行をすべて残すか右側に記述されたテーブルの行を全て残すか、によって行います。

例として、goodsテーブルとcategoryテーブルをctg_id列を使って結合するときに、goodsテーブルの行をすべて場合のSQL文を記述してみましょう。

SELECT goods_name,ctg_name FROM goods 
LEFT OUTER JOIN category USING (ctg_id)
SELECT goods_name,ctg_name FROM goods 
RIGHT OUTER JOIN category USING (ctg_id)

実行結果

hyou6

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句は左右両方の行を全て残すというものです。

記述の方ほうは次のとおりになります。

SELECT * FROM goods FULL OUTER JOIN category USING (ctg_id)

残念ながらMySQL5.1ではサポートされていませんが、実用性のあるSQL文なので、覚えておきましょう。

他のRDBMSを使用するときに役立つはずです。

また、MySQLでFULL OUTER JOIN句を使わずに同じ結果セットを取得するには、UNION演算子を使って次のようにSQL文を記述します。

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)

UNION演算子は集合演算子と呼ばれます。集合演算子はSELECT文の結果を集合とみなして、その集合を演算するものです。高度なSQL文になっています。

さいごに

今回は複数のテーブルからデータを取得する方法について紹介いたしました。
次回は、3つ以上のテーブルからデータを取得する方法や、テーブルの結合と選択を同時に行う方法について紹介いたします。

投稿者情報

パンダマン

パンダマン

パンダマンです。

主にWebシステム開発等を担当しております。
設計・プログラミング。サーバー管理なんでもやります。

今、担当しているプロジェクトではJavaの今まで触れたことのないフレームワークを使うことになり勉強中です。
学生にC言語のプログラミングの基礎を教えたりもしています。
最近「キングダム」にはまっています。

>> パンダマンが執筆した他の記事を読む

法人向け人気レンタルサーバー
法人向け人気専用サーバー
個人向け人気レンタルサーバー