ORACLE機能 SQL

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

投稿日:

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

執筆者:



comment

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

スポンサーリンク