【SQL】JOINの結合条件(ON)とWHEREの条件の使い方の違いについて 外部結合の場合に取得結果が異なることがあるので、混同しないように。
条件をON句に書く場合とWHERE句に書く場合の違い

例えば、以下のようなデータで「削除フラグ=0」のデータを取得する場合に、 ONで絞り込み条件を指定する場合と、 WHEREで絞り込み条件を指定する場合で、以下のようなSQLになります。

社員テーブル  

id名前部署id
1Aさん100
2Bさん100
3Cさん101

部署テーブル

id名前削除フラグ
100システム部0
101営業部1


1. ONで絞り込み条件を指定した場合(内部結合)

SELECT *
  FROM 社員テーブル ST
  INNER JOIN 部署テーブル BT
    ON ST.部署id = BT.id
   AND BT.削除フラグ = '0'

結果:

id名前部署id名前(部署)削除フラグ
1Aさん100システム部0
2Bさん100システム部0

ONの結合条件に、削除フラグ0を指定しているので、条件に一致しないレコードは取得できず、 内部結合なので、2件になります。

2. WHEREで絞り込み条件を指定した場合

SELECT *
  FROM 社員テーブル ST
  LEFT JOIN 部署テーブル BT
    ON ST.部署id = BT.id
 WHERE BT.削除フラグ = '0'

結果:

id名前部署id名前(部署)削除フラグ
1Aさん100システム部0
2Bさん100システム部0

テーブルを結合した結果(部署idで紐づいたテーブル)に対して、絞り込みする。 取得結果は、2件となる。
内部結合と結果は同じになります。

外部結合時は取得結果が異なる

内部結合と同様に条件を記述した場合、以下のような結果になります。

ONで絞り込み条件を指定した場合

SELECT *
  FROM 社員テーブル ST
  LEFT JOIN 部署テーブル BT
    ON ST.部署id = BT.id
   AND BT.削除フラグ = '0'

結果:  

id名前部署id名前(部署)削除フラグ
1Aさん100システム部0
2Bさん100システム部0
3Cさん101NULLNULL

ONの結合条件に、削除フラグ0を指定しているので、条件に一致しないレコードは取得できず、 NULLデータとなり、3件になります。

まとめ

内部結合の場合は、ON句とWHERE句のどちらに書いても結果は同じになります。

外部結合の場合は、ON句に書く場合とWHERE句に書く場合で結果は異なるので、 条件に合致しないデータも取得結果に含めたい場合はON句に、 含めたくない場合はWHERE句に書くようにしましょう。



今日はここまで。