JOINとは…
テーブルとテーブルをある特定のキーを使用して結合する構文。
INNER JOINは、マスターテーブルと対象テーブルで一致したレコードだけを結合し抽出する。主キーと一致しなかったマスターテーブルは抽出されない。
OUTER JOINは、マスタテーブルはすべて抽出し、一致したレコードが対象テーブルにあれば抽出する。
内部結合 — INNER JOIN
2つのテーブルにある特定キーをもとにテーブルを結合する。
【例】台帳テーブルをマスタとし、商品idを主キーにして、一致したレコードだけを結合し抽出する。
SELECT
*
FROM
台帳テーブル
INNER JOIN
ON 台帳テーブル.商品id = 商品テーブル.商品id
;
台帳テーブル
台帳id | 商品id | 個数 |
1 | 2 | 1 |
2 | 4 | 1 |
3 | 1 | 3 |
4 | 3 | 2 |
5 | 5 | 4 |
6 | 6 | 2 |
7 | 9 | 1 |
商品テーブル
商品id | 製品名 | 単価 |
1 | りんご | 100 |
2 | みかん | 120 |
3 | いちご | 400 |
4 | ばなな | 80 |
5 | かき | 240 |
商品idの赤字になっている箇所が一致。台帳テーブルに一致した商品テーブルをJOINし、一致しなかった台帳テーブルの下2つのレコードは表示しません。
[結合後]台帳テーブル
台帳id | 商品id | 個数 | 商品id | 製品名 | 単価 |
1 | 2 | 1 | 2 | みかん | 120 |
2 | 4 | 1 | 4 | ばなな | 80 |
3 | 1 | 3 | 1 | りんご | 100 |
4 | 3 | 2 | 3 | いちご | 400 |
5 | 5 | 4 | 5 | かき | 240 |
外部結合 — OUTER JOIN
上記で使用したINNER JOINは一致しなかった台帳テーブルのレコードは表示されませんでした。
それに対し、OUTER JOINは、マスタとなるテーブルを全て抜き出し、主キーが一致する別テーブルのレコードを抜き出すことができます。
【例】台帳テーブルをマスタとし全て抜き出したあと、商品idを主キーにして、一致したレコードを結合し、抽出する。
SELECT
*
FROM
台帳テーブル
OUTER JOIN
ON 台帳テーブル.商品id = 商品テーブル.商品id
;
台帳テーブル
台帳id | 商品id | 個数 |
1 | 2 | 1 |
2 | 4 | 1 |
3 | 1 | 3 |
4 | 3 | 2 |
5 | 5 | 4 |
6 | 6 | 2 |
7 | 9 | 1 |
商品テーブル
商品id | 製品名 | 単価 |
1 | りんご | 100 |
2 | みかん | 120 |
3 | いちご | 400 |
4 | ばなな | 80 |
5 | かき | 240 |
結合後、、、台帳テーブルに商品idが一致する商品テーブルのレコードのみを結合します。一致しなかった台帳テーブル(赤字)のレコードは結合部分はNULLですが、そのまま残ります。
[結合後]台帳テーブル
台帳id | 商品id | 個数 | 商品id | 製品名 | 単価 |
1 | 2 | 1 | 2 | みかん | 120 |
2 | 4 | 1 | 4 | ばなな | 80 |
3 | 1 | 3 | 1 | りんご | 100 |
4 | 3 | 2 | 3 | いちご | 400 |
5 | 5 | 4 | 5 | かき | 240 |
6 | 6 | 2 | – | – | – |
7 | 9 | 1 | – | – | – |
どちらをマスタにするか? — LEFT/RIGHT OUTER JOIN
上記で作ったOUTER JOINはマスタはFROM句で使用したテーブル(台帳テーブル)としていました。
では、JOIN句で使用した商品テーブルをマスタにするときは?
上記のOUTER JOINの前に”RIGHT”をつけます。
SELECT
*
FROM
台帳テーブル
RIGHT OUTER JOIN
ON 台帳テーブル.商品id = 商品テーブル.商品id
;