条件をON句に書く場合とWHERE句に書く場合の違い
例えば、以下のようなデータで「削除フラグ=0」のデータを取得する場合に、 ONで絞り込み条件を指定する場合と、 WHEREで絞り込み条件を指定する場合で、以下のようなSQLになります。
社員テーブル
id | 名前 | 部署id |
---|---|---|
1 | Aさん | 100 |
2 | Bさん | 100 |
3 | Cさん | 101 |
部署テーブル
id | 名前 | 削除フラグ |
---|---|---|
100 | システム部 | 0 |
101 | 営業部 | 1 |
1. ONで絞り込み条件を指定した場合(内部結合)
SELECT *
FROM 社員テーブル ST
INNER JOIN 部署テーブル BT
ON ST.部署id = BT.id
AND BT.削除フラグ = '0'
結果:
id | 名前 | 部署id | 名前(部署) | 削除フラグ |
---|---|---|---|---|
1 | Aさん | 100 | システム部 | 0 |
2 | Bさん | 100 | システム部 | 0 |
ONの結合条件に、削除フラグ0を指定しているので、条件に一致しないレコードは取得できず、 内部結合なので、2件になります。
2. WHEREで絞り込み条件を指定した場合
SELECT *
FROM 社員テーブル ST
LEFT JOIN 部署テーブル BT
ON ST.部署id = BT.id
WHERE BT.削除フラグ = '0'
結果:
id | 名前 | 部署id | 名前(部署) | 削除フラグ |
---|---|---|---|---|
1 | Aさん | 100 | システム部 | 0 |
2 | Bさん | 100 | システム部 | 0 |
テーブルを結合した結果(部署idで紐づいたテーブル)に対して、絞り込みする。 取得結果は、2件となる。
内部結合と結果は同じになります。
外部結合時は取得結果が異なる
内部結合と同様に条件を記述した場合、以下のような結果になります。
ONで絞り込み条件を指定した場合
SELECT *
FROM 社員テーブル ST
LEFT JOIN 部署テーブル BT
ON ST.部署id = BT.id
AND BT.削除フラグ = '0'
結果:
id | 名前 | 部署id | 名前(部署) | 削除フラグ |
---|---|---|---|---|
1 | Aさん | 100 | システム部 | 0 |
2 | Bさん | 100 | システム部 | 0 |
3 | Cさん | 101 | NULL | NULL |
ONの結合条件に、削除フラグ0を指定しているので、条件に一致しないレコードは取得できず、 NULLデータとなり、3件になります。
まとめ
内部結合の場合は、ON句とWHERE句のどちらに書いても結果は同じになります。
外部結合の場合は、ON句に書く場合とWHERE句に書く場合で結果は異なるので、 条件に合致しないデータも取得結果に含めたい場合はON句に、 含めたくない場合はWHERE句に書くようにしましょう。
今日はここまで。