Перекрёстные соединения и декартовы произведения
Осознанно используйте CROSS JOIN для создания всех комбинаций и избегайте случайного взрывного роста декартова произведения из-за отсутствующих ключей соединения
«Перекрёстные соединения и декартовы произведения» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое CROSS JOIN?
CROSS JOIN создаёт все комбинации строк: m × n выходных строк. Предложение ON не используется.
SELECT * FROM a CROSS JOIN b;
-- Equivalent:
SELECT * FROM a, b; -- comma join, no conditionСлучайные декартовы произведения
Классическая ошибка: забыть условие JOIN и получить каждую строку A в паре с каждой строкой B.
SELECT u.email, o.id
FROM users u, orders o; -- missing WHERE u.id = o.user_id !
-- m users × n orders rows — millions!Преднамеренные сценарии использования
CROSS JOIN полезен, когда действительно нужны все пары:
- Комбинации категорий и периодов времени для отчётов с пустыми интервалами
- Тестовые данные: каждый пользователь и каждый товар
- Календари: каждый магазин и каждая дата
Пример с календарём и магазинами
Заполните нулевые дни для каждого магазина:
SELECT d.day, s.id, COALESCE(SUM(o.total), 0) AS revenue
FROM generate_series(CURRENT_DATE - 30, CURRENT_DATE, '1 day') AS d(day)
CROSS JOIN stores s
LEFT JOIN orders o ON o.store_id = s.id
AND date_trunc('day', o.created_at) = d.day
GROUP BY d.day, s.id
ORDER BY d.day, s.id;Декартовы произведения и EXPLAIN
Непреднамеренное декартово произведение отображается в EXPLAIN ANALYZE как огромное количество строк:
EXPLAIN ANALYZE
SELECT u.email, o.id FROM users u, orders o;
-- Nested Loop (rows=10000000) ← warning signLATERAL: условное перекрёстное соединение
LATERAL JOIN похож на CROSS JOIN, в котором правая сторона может обращаться к левой. Подробнее — в следующем уроке.
Перестановки и сочетания
Для пар (A,B) без дубликатов добавьте сравнение в ON:
SELECT a.id, b.id
FROM products a
JOIN products b ON a.id < b.id;
-- All unique pairs of products, no (A,A), no (B,A) duplicates of (A,B)CROSS JOIN с VALUES
Встройте небольшой набор данных:
SELECT u.email, c.code
FROM users u
CROSS JOIN (VALUES ('EUR'), ('USD'), ('GBP')) AS c(code);Избегайте синтаксиса соединения через запятую
Неявное соединение через запятую (FROM a, b) допустимо, но скрывает намерение. Предпочитайте явный CROSS JOIN:
-- Don't (looks like a typo):
FROM users, orders
-- Do:
FROM users CROSS JOIN ordersПроизводительность
Сам CROSS JOIN выполняется дёшево: проверять условие не нужно. Затраты определяются количеством выходных строк: 10k × 10k = 100M строк.
Итоги
CROSS JOIN = все пары.
- Используйте его осознанно для построения комбинаций
- Следите за случайными декартовыми произведениями из-за отсутствующего WHERE
- Сочетайте его с generate_series для заполнения пропусков в отчётах
Быстрая проверка
Вы написали SELECT * FROM users u, orders o; без WHERE. Что будет выведено?
Часто задаваемые вопросы
Урок «Перекрёстные соединения и декартовы произведения» бесплатный?
Да — полный текст урока «Перекрёстные соединения и декартовы произведения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Перекрёстные соединения и декартовы произведения»?
Осознанно используйте CROSS JOIN для создания всех комбинаций и избегайте случайного взрывного роста декартова произведения из-за отсутствующих ключей соединения Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Перекрёстные соединения и декартовы произведения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Перекрёстные соединения и декартовы произведения
- Латеральные соединения (LATERAL JOIN)
- Антисоединения и полусоединения (NOT EXISTS)
- Оптимизация производительности соединений нескольких таблиц