ryoma's note

マイペース ੯•́ʔ̋ ͙͛*͛ ͙͛*͛ ͙͛̋و

ON 句に検索条件を書くとき

業務でクエリを読んでいたところ、ON 句には結合条件だけではなく検索条件も書けることを知った。WHERE 句に書く場合との違いはあるのかなと調べてみると、外部結合で利用すると抽出結果に差異が生じることがあるので注意する必要があるみたい。

外部結合で WHERE 句に検索条件を記述

SELECT
  * 
FROM
  users 
  LEFT JOIN prefectures 
    ON users.prefecture_id = prefectures.id 
WHERE
  prefectures.id = 5;
+------+---------------+--------+------+-----------+
| id   | prefecture_id | name   | id   | name      |
+------+---------------+--------+------+-----------+
|    1 |             5 | イヌ   |    5 | 秋田県    |
+------+---------------+--------+------+-----------+

外部結合で ON 句に検索条件を記述

SELECT
  * 
FROM
  users 
  LEFT JOIN prefectures 
    ON users.prefecture_id = prefectures.id 
    AND prefectures.id = 5;
+------+---------------+--------+------+-----------+
| id   | prefecture_id | name   | id   | name      |
+------+---------------+--------+------+-----------+
|    1 |             5 | イヌ   |    5 | 秋田県    |
|    2 |             9 | サル   | NULL | NULL      |
|    3 |            33 | キジ   | NULL | NULL      |
+------+---------------+--------+------+-----------+

ON 句の場合は、テーブルを結合する前に検索条件の絞り込みが行われるので、左側の軸となるテーブルのレコードがすべて表示されている。個人的に ON 句には結合条件だけ書くようにして、意図しない結果にならないように気をつけようと思う。