Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: cross, join

Что произойдет при выполнении запроса вида SELECT * FROM t1, t2 WHERE ... LIMIT 10 в Postgres?

Вопрос проверяет понимание того, как SQL обрабатывает перечисление таблиц в FROM и что происходит без явного JOIN.

Короткий ответ

Если таблицы перечислены через запятую, PostgreSQL выполняет декартово произведение (cross join), а затем применяет условие WHERE. Это означает, что сначала формируются все возможные пары строк, а потом они фильтруются. LIMIT ограничивает уже итоговый результат. Такой запрос может быть очень медленным при больших таблицах.

Длинный ответ

Когда в SQL таблицы перечислены через запятую, это означает неявное соединение.

Определение:
Декартово произведение (Cartesian product) — это комбинация каждой строки одной таблицы с каждой строкой другой.

1. Как выполняется запрос

Логика выполнения:

  1. Формируется декартово произведение t1 × t2

  2. Применяется условие WHERE

  3. Применяется LIMIT

Важно понимать, что LIMIT не уменьшает объем промежуточных вычислений.

2. Пример

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;

Но второй вариант:

  1. Читается проще

  2. Явно показывает намерение

3. Возможные проблемы

Если забыть условие:

SELECT * FROM t1, t2;

Результат:

  1. Очень большой набор строк

  2. Сильная нагрузка на БД

4. Как PostgreSQL оптимизирует

Оптимизатор:

  1. Может перестроить план

  2. Может применить join-стратегии

Но логически это все равно JOIN.

Вывод

Перечисление таблиц через запятую приводит к декартову произведению с последующей фильтрацией. На практике лучше использовать явный JOIN.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Postgres

    Postgres

Ключевые слова

#cross

#join

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.