Рассмотрим примеры:
select id, name from tbl_users u join tbl_groups g on u.group_id = g.id where g.name= 'some group'
и
select id, name from tbl_users u join tbl_groups g on u.group_id = g.id and g.name= 'some group'
Что будет результатом выполнения зарпосов? Все пользователи (id и имя), относящиеся к группе ‘some group’.
На первый взгляд разницы между двумя этими запросами нет, но будут ли одинаковыми результаты следующих запросов, использующих left join?
select u.id, rent from tbl_users u left join user_payment p on p.user_id = u.id where p.type= 'fine' or p.type is null
и
select u.id, rent from tbl_users u left join user_payment p on p.user_id = u.id and (p.type= 'fine' or p.type is null)
Нет, не будут. В первом случае мы получим всех пользователей, которые совершили платеж типа ‘fine’ и тех, кто ни разу не совершал никакого платежа. Во втором — всех пользователей, независимо от того, совершали ли они какие-то платежи. При этом во второй выборке поле rent будет заполнено платежом типа fine, если найдется такая запись в таблице user_payment, иначе — null.
Надо помнить, что условие в on относится только к операции join, тогда как в where — ко всему запросу целиком. Соответственно,
- если не удовлятворяется условие по on, то мы все равно получаем все строки из первой таблицы, а отсутствующие данные из второй таблицы дополняются Null.
- Если же не удовлетворяется условие по where, то мы такие строки в выборке вообще не получаем.