LoginSignup
0
1

More than 5 years have passed since last update.

選択(結合:外部結合)

Last updated at Posted at 2016-11-07

結びつかなくても全て表示。

外部結合を使用すると指定した列のデータがテーブルのどちらか一方にしかないレコードも抽出することができます。 外部結合には左外部結合、右外部結合、完全外部結合があります。

左外部結合 (LEFT OUTER JOIN)

左外部結合は結合する列のデータを基準として、左側の表の内容をすべて抽出し、右側の表の内容は左側の表の内容と一致するもののみ抽出する結合です。 左外部結合を使用するにはLEFT OUTERE JOINを使用します。

SELECT (取得するカラム) FROM テーブル1名 LEFT OUTER JOIN テーブル名2 ON (結合条件)

取得するデータは2つのテーブルのカラムが混合したものとなりますので、取得するカラムの指定には「カラム名」ではなくどのテーブルのカラムなのかを表すために「テーブル名.カラム名」の形で指定

外部結合は内部結合の場合と似ているのですが、LEFT OUTER JOIN句を使用する場合は結合の対象となっているカラムの値が一致しているデータに加えて、カラムの値がFROMの後に書かれたテーブルにしかなかった場合でもデータとして取得します。

先ほどのサンプルを元にどのようにテーブルが外部結合(LEFT OUTER JOIN句)されるのかについて確認していきます。まずSELECT文の最初に記述されたテーブルの1つ目のデータに対して結合が行われます。

id name      deptid
--------------------
1  Yamada    1

結合条件は「staff.deptid = dept.id」です。このデータの「deptid」の値は「1」ですので、deptテーブルのデータの中で「id」カラムの値が「1」のものがあるかどうかを調べます。今回は1つ見つかりました。

id name
------------
1  Sales

見つかった場合にはこの2つのテーブルのデータを結合して1つのデータとして返します。

id name      deptid   id name
-------------------------------
1  Yamada    1        1  Sales

もし結合条件に一致しないデータがあった場合、外部結合(LEFT OUTER JOIN句)の場合にはFROMの後に書かれたテーブルのデータだけを取得します。下記のデータの場合、「deptid」カラムの値が「5」ですが、deptテーブルのデータの中には「id」カラムの値が「5」のものがありませんのでstaffテーブルの値だけを取得します。

id name      deptid   id name
-----------------------------------
1  Yamada    1        1  Sales
2  Suzuki    3        3  Publicity
3  Kuroda    2        2  Technical
4  Ishida    1        1  Sales
5  Takahashi 5
6  Eguchi    2        2  Technical
7  Adachi    1        1  Sales```

内部結合の場合と違い外部結合の場合は結合条件に一致しないデータでも取得することに注意して下さい。

ON 句

ON SI.item_id = I.item_id;
ON 句では、結合するテーブルを結びつける列(結合キー)を指定します。この場合は商品 ID
(item_id)が結合キーです。いわば ON は、結合条件専用の WHERE のような役割だといえま
す。WHERE 句と同じように、複数の結合キーを指定するために、AND、OR を使うことも出来
ます。
ON 句は、内部結合を行なう場合は記述が必須です。かつ、書く場所は FROM と WHERE の
間でなくてはなりません。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1