Вопрос проверяет понимание того, как SQL обрабатывает перечисление таблиц в FROM и что происходит без явного JOIN.
Если таблицы перечислены через запятую, PostgreSQL выполняет декартово произведение (cross join), а затем применяет условие WHERE. Это означает, что сначала формируются все возможные пары строк, а потом они фильтруются. LIMIT ограничивает уже итоговый результат. Такой запрос может быть очень медленным при больших таблицах.
Когда в SQL таблицы перечислены через запятую, это означает неявное соединение.
Определение:
Декартово произведение (Cartesian product) — это комбинация каждой строки одной таблицы с каждой строкой другой.
Логика выполнения:
Формируется декартово произведение t1 × t2
Применяется условие WHERE
Применяется LIMIT
Важно понимать, что LIMIT не уменьшает объем промежуточных вычислений.
SELECT *
FROM users, orders
WHERE users.id = orders.user_id
LIMIT 10;
Этот запрос эквивалентен:
SELECT *
FROM users
JOIN orders ON users.id = orders.user_id
LIMIT 10;
Но второй вариант:
Читается проще
Явно показывает намерение
Если забыть условие:
SELECT * FROM t1, t2;
Результат:
Очень большой набор строк
Сильная нагрузка на БД
Оптимизатор:
Может перестроить план
Может применить join-стратегии
Но логически это все равно JOIN.
Перечисление таблиц через запятую приводит к декартову произведению с последующей фильтрацией. На практике лучше использовать явный JOIN.