「テーブルの結合」の版間の差分
(ページの作成:「== 概要 == SQL Serverをはじめ、各データベースはテーブルをJOIN(結合)することがよくある。<br> ここでは代表的なJOINの種類につい…」) |
|||
12行目: | 12行目: | ||
INNER JOIN(内部結合)は、両方のテーブルの結合条件に一致するものだけを取得する。<br> | INNER JOIN(内部結合)は、両方のテーブルの結合条件に一致するものだけを取得する。<br> | ||
外部結合のようにテーブルの優先度は存在しない。<br> | 外部結合のようにテーブルの優先度は存在しない。<br> | ||
<br> | |||
SQL Serverでは、INNER JOINをJOINと記述してもよい。<br> | |||
<br> | |||
===== INNER JOIN句の使用方法 ===== | |||
SQL Serverで内部結合するには、INNER JOIN句の前後に結合するテーブルを記述する。 | |||
テーブル名の後にスペースを入れて別名を指定する。 | |||
ON句は結合する列を指定する。列はテーブル名の別名を必ず付ける。 | |||
内部結合は、INNER JOIN句を使用せずに、結合条件をWHERE句で記述することもできる。 | |||
<br> | |||
===== サンプルデータ ===== | |||
<center> | |||
'''empテーブル'''<br> | |||
{| class="wikitable" | |||
|- | |||
! no !! name | |||
|- | |||
| A001 || 佐藤花子 | |||
|- | |||
| A002 || 田中太郎 | |||
|- | |||
| A003 || 加藤一 | |||
|- | |||
| A004 || 青木花 | |||
|- | |||
| A005 || 藤田学 | |||
|} | |||
</center> | |||
<br> | |||
<center> | |||
'''tokyo_autテーブル''' | |||
{| class="wikitable" | |||
|- | |||
! no | |||
|- | |||
| A001 | |||
|- | |||
| A005 | |||
|} | |||
</center> | |||
<br> | |||
<center> | |||
'''osaka_autテーブル''' | |||
{| class="wikitable" | |||
|- | |||
! no | |||
|- | |||
| A001 | |||
|- | |||
| A002 | |||
|} | |||
</center> | |||
<br> | |||
===== 例1 INNER JOIN句で結合する ===== | |||
empテーブルとtokyo_autテーブル、osaka_autテーブルの3つのテーブルをINNER JOIN句で内部結合する。<br> | |||
これら3つのテーブルに、noが存在するレコードであるA001のみ抽出される。 | |||
<source lang="sql"> | |||
--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'; | |||
</source> | |||
<br> | |||
<center> | |||
{| class="wikitable" | |||
|- | |||
! e.no !! e.name !! tokyo !! osaka | |||
|- | |||
| A001 || 佐藤花子 || A001 || A001 | |||
|} | |||
</center> | |||
<br> | |||
===== 例2 WHERE句で結合する(INNER JOIN句を使用しないパターン) ===== | |||
<source lang="sql"> | |||
--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; | |||
</source> | |||
<br> | |||
<center> | |||
{| class="wikitable" | |||
|- | |||
! e.no !! e.name !! tokyo !! osaka | |||
|- | |||
| A001 || 佐藤花子 || A001 || A001 | |||
|} | |||
</center> | |||
<br><br> | <br><br> | ||
2020年3月10日 (火) 23:28時点における版
概要
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と記述してもよい。
RIGHT OUTER JOIN(右外部結合)
RIGHT OUTER JOIN(右外部結合)は、LEFT OUTER JOINの左右の優先度を逆にした結合である。
SQL文のFROM句で、右側にあるテーブルを優先して全レコード取得する。
結合される方のテーブルは、優先テーブルと一致する条件のレコードのみ取得する。
SQL Serverでは、RIGHT OUTER JOINをRIGHT JOINと記述してもよい。
FULL OUTER JOIN(完全外部結合)
FULL OUTER JOIN(完全外部結合)は、両方のテーブルのどちらも優先で、
結合条件で一致するレコードも一致しないレコードも全て取得する。
LEFT OUTER JOIN、RIGHT OUTER JOINのように、どちらかのテーブルを優先しない。
SQL Serverでは、FULL OUTER JOINをFULL JOINと記述してもよい。