SQL код скопирован в буфер обмена
Узнайте, как использовать SQL CROSS JOIN для создания декартова произведения двух таблиц. Этот урок объясняет, как каждая строка из одной таблицы объединяется с каждой строкой из другой, каковы последствия для производительности при работе с большими наборами данных и практические варианты использования, такие как генерация комбинаций или тестовых данных. Освойте поведение CROSS JOIN на примерах базы данных Sakila.
EN PT

Урок 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

Существует два способа записи CROSS JOIN. Явный способ предпочтительнее для ясности:

-- Явный синтаксис (рекомендуется)
SELECT
    table1.column,
    table2.column
FROM
    table1
CROSS JOIN
    table2;

-- Неявный синтаксис (старый стиль)
SELECT
    table1.column,
    table2.column
FROM
    table1,
    table2;

Предупреждение: Будьте крайне осторожны при использовании 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 (нет условия сопоставления).
  • Количество строк в результате - это произведение количества строк обеих таблиц.
  • Используйте его с осторожностью на больших наборах данных, чтобы избежать проблем с производительностью.