テーブルの結合

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

SQL Serverをはじめ、各データベースはテーブルをJOIN(結合)することがよくある。
ここでは代表的なJOINの種類について記載する。

  • INNER JOIN(内部結合)
  • LEFT OUTER JOIN(左外部結合)
  • RIGHT OUTER JOIN(右外部結合)
  • FULL OUTER JOIN(完全外部結合)
Database Join 1.jpg



INNER JOIN(内部結合)

INNER JOIN(内部結合)は、両方のテーブルの結合条件に一致するものだけを取得する。
外部結合のようにテーブルの優先度は存在しない。

SQL Serverでは、INNER JOINをJOINと記述してもよい。

INNER JOIN句の使用方法

SQL Serverで内部結合するには、INNER JOIN句の前後に結合するテーブルを記述する。
テーブル名の後にスペースを入れて別名を指定する。
ON句は結合する列を指定する。列はテーブル名の別名を必ず付ける。

内部結合は、INNER JOIN句を使用せずに、結合条件をWHERE句で記述することもできる。

サンプルデータ

empテーブル

no name
A001 佐藤花子
A002 田中太郎
A003 加藤一
A004 青木花
A005 藤田学


tokyo_autテーブル

no
A001
A005


osaka_autテーブル

no
A001
A002


例1 INNER JOIN句で結合する

empテーブルとtokyo_autテーブル、osaka_autテーブルの3つのテーブルをINNER JOIN句で内部結合する。
これら3つのテーブルに、noが存在するレコードであるA001のみ抽出される。

 --INNER JOIN
 SELECT e.no, e.name, t.no tokyo, o.no osaka
 FROM emp e 
 JOIN tokyo_aut t ON e.no = t.no
 JOIN osaka_aut o ON t.no = o.no 
 WHERE e.no < 'A100';


e.no e.name tokyo osaka
A001 佐藤花子 A001 A001


例2 WHERE句で結合する(INNER JOIN句を使用しないパターン)
 --INNER JOIN句を使用しない
 SELECT e.no, e.name, t.no tokyo, o.no osaka
 FROM emp e, tokyo_aut t, osaka_aut o 
 WHERE e.no < 'A100'
 AND   e.no = t.no
 AND   t.no = o.no;


e.no e.name tokyo osaka
A001 佐藤花子 A001 A001



LEFT OUTER JOIN(左外部結合)

LEFT OUTER JOIN(左外部結合)は、SQL文のFROM句で、左側にあるテーブルを優先して全レコード取得する。
結合される方のテーブルは、優先テーブルと一致する条件のレコードのみ取得する。
LEFT OUTER JOINは、最も利用される結合である。

なお、SQL Serverでは、LEFT OUTER JOINをLEFT JOINと記述してもよい。

LEFT OUTER JOIN句の使用方法

SQL Serverで左外部結合するには、LEFT OUTER JOIN句の前後に結合するテーブルを記述する。
テーブル名の後にスペースを入れて別名を指定する。
ON句は結合する列を指定する。列はテーブル名の別名を必ず付ける。

サンプルデータ

empテーブル

no name
A001 佐藤花子
A002 田中太郎
A003 加藤一
A004 青木花
A005 藤田学


tokyo_autテーブル

no
A001
A005
A010


osaka_autテーブル

no
A001
A002
A009


例 LEFT OUTER JOIN句で複数テーブルを結合する

LEFT OUTER JOIN句で優先されるテーブルは左側にあるempテーブルである。
empテーブルは優先されるテーブルなので、全レコードが抽出される。
以下の例では、empテーブルは5レコードあるので、empテーブルのe.noとe.nameは全て表示される。

tokyo_autテーブルとosaka_autテーブルは、ON句で指定された条件に一致する場合のみ抽出される。
tokyo_autテーブルは、noがA001とA005のみなので、この2レコードのみ表示される。A010は結合条件に一致しないため表示されない。
osaka_autテーブルは、noがA001とA002のみなので、この2レコードのみ表示される。A009は結合条件に一致しないため表示されない。

 --LEFT OUTER JOINの結合
 SELECT e.no, e.name, t.no tokyo, o.no osaka
 FROM emp e 
 LEFT JOIN tokyo_aut t ON e.no = t.no
 LEFT JOIN osaka_aut o ON e.no = o.no 
 WHERE e.no < 'A100';


e.no e.name tokyo osaka
A001 佐藤花子 A001 A001
A002 田中太郎 A002
A003 佐藤花子
A004 佐藤花子
A005 藤田学 A005



RIGHT OUTER JOIN(右外部結合)

RIGHT OUTER JOIN(右外部結合)は、LEFT OUTER JOINの左右の優先度を逆にした結合である。
SQL文のFROM句で、右側にあるテーブルを優先して全レコード取得する。
結合される方のテーブルは、優先テーブルと一致する条件のレコードのみ取得する。

SQL Serverでは、RIGHT OUTER JOINをRIGHT JOINと記述してもよい。

外部結合には、LEFT OUTER JOINとRIGHT OUTER JOINがあるが、LEFT OUTER JOINを使用するのが一般的なので、
ここでは、RIGHT OUTER JOINの例は省略する。


FULL OUTER JOIN(完全外部結合)

FULL OUTER JOIN(完全外部結合)は、両方のテーブルのどちらも優先で、
結合条件で一致するレコードも一致しないレコードも全て取得する。
LEFT OUTER JOIN、RIGHT OUTER JOINのように、どちらかのテーブルを優先しない。

SQL Serverでは、FULL OUTER JOINをFULL JOINと記述してもよい。

FULL OUTER JOIN句の使用方法

SQL Serverで完全外部結合するには、FULL OUTER JOIN句の前後に結合するテーブルを記述する。
テーブル名の後にスペースを入れて別名を指定する。
ON句は、結合する列を指定する。列はテーブル名の別名を必ず付ける。

サンプルデータ

empテーブル

no name
A001 佐藤花子
A002 田中太郎
A003 加藤一
A004 青木花
A005 藤田学


tokyo_autテーブル

no
A001
A010


例 FULL OUTER JOIN句で結合する

empテーブルとtokyo_autテーブルをFULL OUTER JOINで完全外部結合する。
empテーブルにしか存在しないレコード、tokyo_autテーブルにしか存在しないレコードも含めて全て抽出される。

 --FULL JOIN
 SELECT e.no, e.name, t.no tokyo
 FROM emp e 
 JOIN tokyo_aut t ON e.no = t.no
 WHERE e.no < 'A100'


e.no e.name tokyo
A001 佐藤花子 A001
A002 田中太郎
A003 加藤一
A004 青木花
A005 藤田学
A010