JOIN句があるSQLで、WHERE条件はON句にもWHERE句にも書けますが、条件によって結果が違ってきますので注意が必要です。
条件をON句に書く場合とWHERE句に書く場合の違い
結論から書くと、以下のような違いがあります。
- 内部結合(INNER JOIN)の場合は、ON句に書いてもWHERE句に書いても結果は同じ。
- 外部結合(OUTER JOIN)の場合は、ON句とWHERE句に書く場合で結果が異なる。
なので、内部結合の場合はONに書くかWHEREに書くかは好みで良いですが、
外部結合の場合は注意が必要です。
違いの例
以下2つのテーブルをbusyo_cdで外部結合し、条件にbusyo_cd = 104を指定してみます。
no | name | busyo_cd |
---|---|---|
1 | A | 101 |
2 | B | 102 |
3 | C | 103 |
4 | D | 104 |
5 | E | 104 |
busyo_cd | busyo_name |
---|---|
101 | 総務部 |
102 | 経理部 |
103 | 営業部 |
104 | 開発部 |
例)条件をON句に書く場合
- SQL*Plus
- SQL>SELECT u.no, u.name, u.busyo_cd, b.busyo_name FROM m_user u LEFT OUTER JOIN m_busyo b ON u.busyo_cd = b.busyo_cd AND u.busyo_cd = 104 ; NO NAME BUSYO_CD BUSYO_NAME --- ----- --------- ----------- 1 A 101 NULL 2 B 102 NULL 3 C 103 NULL 4 D 104 開発部 5 E 104 開発部 SQL>
条件をON句に書いた場合は、 外部結合では結合しなかった場合でも値を取得するので 条件に合致しないデータも引っ張ってきます。
例)条件をWHERE句に書く場合
- SQL*Plus
- SQL>SELECT u.no, u.name, u.busyo_cd, b.busyo_name FROM m_user u LEFT OUTER JOIN m_busyo b ON u.busyo_cd = b.busyo_cd WHERE u.busyo_cd = 104 ; NO NAME BUSYO_CD BUSYO_NAME --- ----- --------- ----------- 4 D 104 開発部 5 E 104 開発部 SQL>
条件をWHERE句に書いた場合は、 外部結合した結果に対して条件を指定することになるので、 条件に合致しないデータは除外されます。
まとめ
- 内部結合の場合は、ON句とWHERE句のどちらに書いても結果は同じ。
- 外部結合の場合は、条件に合致しないデータも引っ張ってきたい場合はON句に、そうでない場合はWHERE句に書く。
記事名: [SQL] JOIN句があるSQLで条件をON句に書く場合とWHERE句に書く場合の違い
すみません。コメント失礼いたします。
こちらの記事大変勉強になったのですが、1つ質問があります。
Onでの結合条件の話ですが、記事の例ではu.busyo_cd=104を条件にしていますが、この条件ではなくb.busyo_name=総務部にしたらどのような結果になるでしょうか?
回答お願いいたします。
コメントありがとうございます。
「u.busyo_cd=104を条件にしていますが、この条件ではなくb.busyo_name=総務部にしたらどのような結果になるでしょうか?」
このご質問の「b.busyo_name=総務部」を「b.busyo_name='開発部'」と読み替えさせて頂きますが、
結果は「u.busyo_cd=104」を指定した時と同様の検索結果となります。