0Pricing
SQL Academy · Урок

Перекрёстные соединения и декартовы произведения

Осознанно используйте 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 sign

LATERAL: условное перекрёстное соединение

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 — локальная установка не требуется.

Все уроки этого курса

  1. Перекрёстные соединения и декартовы произведения
  2. Латеральные соединения (LATERAL JOIN)
  3. Антисоединения и полусоединения (NOT EXISTS)
  4. Оптимизация производительности соединений нескольких таблиц
← Назад к SQL Academy