ORACLE機能 SQL

[SQL] JOIN句があるSQLで条件をON句に書く場合とWHERE句に書く場合の違い

投稿日:2019年11月14日 更新日:

JOIN句があるSQLで、WHERE条件はON句にもWHERE句にも書けますが、条件によって結果が違ってきますので注意が必要です。

条件をON句に書く場合とWHERE句に書く場合の違い

結論から書くと、以下のような違いがあります。

  • 内部結合(INNER JOIN)の場合は、ON句に書いてもWHERE句に書いても結果は同じ。
  • 外部結合(OUTER JOIN)の場合は、ON句とWHERE句に書く場合で結果が異なる。

なので、内部結合の場合はONに書くかWHEREに書くかは好みで良いですが、
外部結合の場合は注意が必要です。

違いの例

以下2つのテーブルをbusyo_cdで外部結合し、条件にbusyo_cd = 104を指定してみます。

【m_user】
nonamebusyo_cd
1A101
2B102
3C103
4D104
5E104
【m_busyo】
busyo_cdbusyo_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句に書く。

スポンサーリンク

スポンサーリンク

-ORACLE機能, SQL

執筆者:



  1. Tk より:

    記事名: [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」を指定した時と同様の検索結果となります。

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

スポンサーリンク