SQL код скопирован в буфер обмена
EN PT FR

Урок 5.6: CROSS JOIN - Декартово произведение

В то время как большинство соединений требуют определенного условия соответствия (предложение ON), CROSS JOIN работает иначе. Он возвращает все возможные комбинации строк из соединяемых таблиц. Этот результат в математике известен как декартово произведение.

Что такое CROSS JOIN?

CROSS JOIN создает результирующий набор, где количество строк равно произведению количества строк в первой таблице на количество строк во второй таблице. Для сопоставления строк не используется никакое условие; каждая строка таблицы А просто встречается с каждой строкой таблицы Б.

Визуализация:

   Таблица A (Цвета)            Таблица B (Размеры)
   +-----------+                +-----------+
   | цвет      |                | размер    |
   +-----------+                +-----------+
   | Красный   |  --\           | S         |
   | Синий     |  ---|------>   | M         |
   +-----------+  --/           | L         |
                                +-----------+

   Результат (Комбинации):
   Красный, S
   Красный, M
   Красный, L
   Синий, S
   Синий, M
   Синий, L

Если в таблице А 2 строки, а в таблице Б 3 строки, результат будет содержать 2 x 3 = 6 строк.

Синтаксис CROSS JOIN

Существует два способа записи декартова произведения:

-- Явный синтаксис
SELECT
    table1.column,
    table2.column
FROM
    table1
CROSS JOIN
    table2;

-- Неявный синтаксис через запятую
SELECT
    table1.column,
    table2.column
FROM
    table1,
    table2;

Важно понимать: эти способы записи отличаются не только стилем, но и приоритетом операций.

  • Явный JOIN имеет более высокий приоритет и выполняется в общем ряду с другими JOIN по тексту запроса.
  • Запись через запятую имеет более низкий приоритет и фактически обрабатывается после явных JOIN.

Из-за этого смешивание запятой и явных JOIN в одном FROM может менять смысл запроса или вообще приводить к ошибке.

Например, такой запрос некорректен:

FROM a, b JOIN c ON (a.x = c.y AND b.z = c.t)

Почему это ошибка:

  • сначала будет выполняться явный b JOIN c;
  • в области видимости этого соединения таблицы a еще нет;
  • поэтому ссылка на a.x в условии ON недопустима.

Именно поэтому явный CROSS JOIN обычно предпочтительнее: не потому что он просто «нагляднее», а потому что он лучше согласуется с остальными JOIN и не создает скрытых проблем с приоритетом.

Предупреждение: Будьте крайне осторожны при использовании CROSS JOIN на больших таблицах. Соединение двух таблиц по 1000 строк в каждой даст 1 000 000 строк!

Практические примеры (база данных Sakila)

1. Генерация всех возможных комбинаций

Представьте, что нам нужно создать отчет или сетку, которая показывает все категории фильмов для каждого магазина, даже если в этом магазине сейчас нет фильмов такой категории.

SELECT
    s.store_id,
    c.name AS category_name
FROM
    store AS s
CROSS JOIN
    category AS c;

Это создаст список всех категорий для Магазина 1, за которым последует список всех категорий для Магазина 2.

2. Создание тестовых данных или матриц

CROSS JOIN часто используется для генерации больших наборов перестановок для тестирования или для построения календарей/расписаний, где нужно сопоставить все временные интервалы со всеми пользователями.

Когда использовать CROSS JOIN

  • Генерация перестановок: Когда вам нужен список всех возможных комбинаций (например, все цвета товаров со всеми размерами).
  • Заполнение пропусков: При использовании с LEFT JOIN это может помочь выявить отсутствующие комбинации в ваших данных.
  • Отчетность: Для создания «каркаса» отчета, который должен включать все категории, даже те, в которых значения равны нулю.

Ключевые выводы урока

  • CROSS JOIN возвращает декартово произведение двух таблиц.
  • Он не использует предложение ON (нет условия сопоставления).
  • Количество строк в результате — это произведение количества строк обеих таблиц.
  • Используйте его с осторожностью на больших наборах данных, чтобы избежать проблем с производительностью.