Разница между ON и WHERE в SQL: подробный разбор
Быстрый ответ
Главное отличие между ON и WHERE в SQL заключается в их функциональности: ON определяет условие, по которому происходит соединение таблиц, в то время как WHERE осуществляет фильтрацию результатов запроса. Вот пример:
SELECT a.*, b.*
FROM TableA a
JOIN TableB b ON a.id = b.foreign_id -- ON определяет, по какому условию нужно соединить таблицы.
WHERE b.value > 100; -- WHERE отфильтровывает результат, оставляя только те записи, где значение больше 100.
Таким образом, ON отвечает за связывание таблиц, а WHERE – за отбор данных из уже сформированного результата.

Что происходит "за кулисами" при объединении
В операциях JOIN условие ON ведет себя как мост между строками двух таблиц. В свою очередь, WHERE выступает в роли фильтра, пропуская через себя уже объединенное множество данных и удаляя лишние строки.
Left outer join – особенный случай
При использовании LEFT OUTER JOIN условие в ON определяет, какие строки из "левой" таблицы попадут в результат, даже если в "правой" таблице нет подходящих значений – в этом случае вместо данных будет NULL. Однако WHERE может исключить строки с NULL, тем самым превратив outer join в inner join.
Влияние на производительность – скрытый потенциал
Грамотное использование ON и WHERE помогает оптимизировать запросы: они сокращают количество обрабатываемых данных и ускоряют выполнение запроса. Все мы любим быстрые запросы!
Визуализация
Представим, у нас есть две школьные площадки – А и Б:
Площадка А: [Ученик 1, Ученик 2, Ученик 3] Площадка Б: [Ученик 2, Ученик 3, Ученик 4]
Конструкция "ON" схожа с дружественным браслетом:
Браслеты у учеников: [Ученик 2, Ученик 3]
# "ON" соединяет учеников, у которых совпадают браслеты.
Оператор "WHERE" похож на выбор после перемены:
Ученика 4 так и не выбрали
# "WHERE" отфильтровывает учеников уже после выбора.
Таким образом, ON собирает команды, а WHERE помогает выделить лидеров.
Нюансы объединений
INNER JOIN зачастую позволяет использовать ON и WHERE в интерчейнджабельной манере. Однако, это не применимо для OUTER JOINS. В LEFT OUTER JOIN ON указывает, какие строки могут попасть в результирующий набор, включая возможные NULL значения, а WHERE может дополнительно пофильтровать полученные данные.
Питфолы и решения
Ошибкой является, когда в LEFT OUTER JOIN условие в WHERE включает в себя поля правой таблицы, что ведет к исключению некоторых строк левой таблицы. Использование IS NULL или функции COALESCE в WHERE позволяют контролировать эту ситуацию.
Понятные запросы – эффективные запросы
С точки зрения читаемости кода рекомендуется использовать ON исключительно для определения связей между таблицами и WHERE для фильтрации данных. Такие запросы более удобны, и их поддержка будет проще.
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 15.2.13.2 Синтаксис
JOIN— Официальное описание синтаксисаJOINот создателей MySQL. - Визуальное представление SQL соединений – CodeProject — Визуализация помогает лучше осознать концепции, поэтому это руководство будет очень полезным.
- SQL JOIN — Визуальные примеры, помогающие выразительнее вникнуть в суть
JOIN. - SQL Outer Joins | Промежуточный SQL – Mode — Подробное рассмотрение
OUTER JOINSи условий вWHERE. - SQLBolt – Изучаем SQL – Урок 6: Многотабличные запросы с помощью JOINs — Платформа для тренировки и улучшения навыков работы с
JOIN. - SQL Joins — Руководство по
JOINв SQL для начинающих. - Joins — Детальный обзор разных видов соединений в Oracle.