SQLもいろいろな省略して記述ができるので、
独特の書かれ方をすると理解しにくい場合がある。

ここで扱う結合に関しても、
省略して書くことができるためわかりにくい場合がある。

特にどの種類で結合されているかを誤解すると、
SQLの意図を大きく間違える可能性があるので
省略されていても結合の種類を見分ける方法をまとめたいと思う。

結合のおさらい

結合を見分ける前に、
そもそも結合にはどんな種類があるかおさらい。

結合は次の表のように、
おおまかに5種類に分類できる。

そして、この結合の前後に結合条件を記述する。

 
結合は5種類
結合の種類 キーワード 概要
直積 CROSS JOIN 2つの表の全組み合わせ(総当たり)になる結合。
内部結合 INNER JOIN 2つの表に値が等しいものが存在しない場合、行は生成しない結合。
外部結合 左外部結合 LEFT OUTER JOIN 値が等しいものが存在しない場合も、行は生成する結合。

このとき、結合する表のどちらに値が存在しない場合なのかを指定しなければ成立しない。
よって基準にする表により、「LEFT(左外部結合)」と「RIGHT(右外部結合)」がある。

また、どちらか一方に値があるだけでも結合可能な「FULL(完全外部結合)」もある。
右外部結合 RIGHT OUTER JOIN
完全外部結合 FULL OUTER JOIN
 
結合条件は3種類
結合条件 概要
NATURAL データベースが判断して、同じ名前のカラム名であれば条件とする。
「JOIN」というキーワードの前に記述するので、一種の結合かと思ってしまうが結合ではない。条件である。
ON カラム名が違うものがある場合に利用する。
USING カラム名が全く同じ場合に利用できる。

記述の省略のルール

ルールをまとめると
次の3つになる。

カンマ区切り

カンマ区切りは、「INNER JOIN」の省略となる。

SELECT * FROM tableA,tableB」 ⇒ 「SELECT * FROM tableA INNER JOIN tableB」

「JOIN」のみ

「JOIN」のみは、「INNER JOIN」の省略となる。

SELECT * FROM tableA JOIN tableB」 ⇒ 「SELECT * FROM tableA INNER JOIN tableB」

「LEFT JOIN」と「RIGHT JOIN」

「LEFT JOIN」は、LEFT OUTER JOINの省略となる。
「RIGHT JOIN」は、RIGHT OUTER JOINの省略となる。

SELECT * FROM tableA LEFT JOIN tableB」 ⇒ 「SELECT * FROM tableA LEFT OUTER JOIN tableB」
SELECT * FROM tableA RIGHT JOIN tableB」 ⇒ 「SELECT * FROM tableA RIGHT OUTER JOIN tableB」

結合の見分け方

上記の基本と省略のルールを考慮すると、
次の原則と判別方法が見えてくる。

原則

  • 直積の場合は、必ず「CROSS JOIN」と書かれる(省略できない)。
    また、結合条件を指定できない。
  • 外部結合の場合は、「LEFT」「RIGHT」「FULL」というキーワードを
    必ず指定する(省略できない)。

判別方法

次の順で考える、結合の種類を判定できる。

  1. 「CROSS JOIN」と書かれていたら、直積。
  2. 「LEFT」「RIGHT」「FULL」のキーワードが書かれていたら、外部結合。
  3. 上記以外だったら、内部結合。

PR