Различия между on и where в SQL

Рассмотрим примеры:

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, то мы такие строки в выборке вообще не получаем.

 

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.