Логически FROM/JOIN формирует строки до WHERE, но физически оптимизатор вправе протолкнуть фильтр к чтению table1. В приведённом INNER JOIN декартово произведение не требуется.
Порядок применения фильтров и соединений в SQL‑запросе и возникновение декартового произведения
Логически FROM/JOIN формирует строки до WHERE, но физически оптимизатор вправе протолкнуть фильтр к чтению table1. В приведённом INNER JOIN декартово произведение не требуется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В запросе к базе данных применяется оператор JOIN для объединения таблиц table1 и table2, а также условие WHERE для отбора нужных записей.
- Какой этап происходит первым: применение условия WHERE или выполнение соединения JOIN?
- По какой причине при использовании JOIN может получаться декартово произведение, когда каждая строка первой таблицы соединяется со всеми строками второй?
- Какие приёмы позволяют предотвратить появление декартового произведения при объединении таблиц?
SELECT * FROM table1 AS t1
JOIN table2 AS t2 ON t1.id = t2.key_id
WHERE t1.id > 100;
Ответ
Логически FROM/JOIN формирует строки до WHERE, но физически оптимизатор вправе протолкнуть фильтр к чтению table1. В приведённом INNER JOIN декартово произведение не требуется.
CROSS JOIN или соединение без корректного ограничения совпадений возвращает сочетания строк; также множество совпадений может возникнуть при неуникальных ключах с обеих сторон. Это не обязательно ошибка: связь many-to-many действительно размножает пары. Используйте подходящий ON, уникальные ограничения там, где они верны по модели, и проверяйте план через EXPLAIN. Перестановка условий ON/WHERE у INNER JOIN часто эквивалентна, но у OUTER JOIN может менять результат.