テーブルの結合
概要
SQL Serverをはじめ、各データベースはテーブルをJOIN(結合)することがよくある。
ここでは代表的なJOINの種類について記載する。
- INNER JOIN(内部結合)
- LEFT OUTER JOIN(左外部結合)
- RIGHT OUTER JOIN(右外部結合)
- FULL OUTER JOIN(完全外部結合)
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 |