← Назад к вопросам

В чем разница между CROSS JOIN и INNER JOIN?

1.7 Middle🔥 161 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

CROSS JOIN vs INNER JOIN

INNER JOIN

Объединяет строки из двух таблиц, где есть совпадение по условию ON.

SELECT * FROM users
INNER JOIN orders ON users.id = orders.user_id;

Пример данных:

users: id, name
1, Alice
2, Bob
3, Charlie

orders: id, user_id, product
10, 1, Laptop
11, 1, Mouse
12, 2, Keyboard

Результат INNER JOIN:

user_id=1, name=Alice, order_id=10, product=Laptop
user_id=1, name=Alice, order_id=11, product=Mouse
user_id=2, name=Bob, order_id=12, product=Keyboard

Charlie не входит (нет заказов)

В Node.js с QueryBuilder:

const result = await userRepository
  .createQueryBuilder('user')
  .innerJoin(
    'user.orders',
    'order',
    'user.id = order.user_id'
  )
  .getMany();

CROSS JOIN

Декартово произведение: каждая строка первой таблицы объединяется с каждой строкой второй таблицы. Нет условия ON.

SELECT * FROM users
CROSS JOIN orders;

Результат (все комбинации):

user_id=1, name=Alice, order_id=10, product=Laptop
user_id=1, name=Alice, order_id=11, product=Mouse
user_id=1, name=Alice, order_id=12, product=Keyboard
user_id=2, name=Bob, order_id=10, product=Laptop
user_id=2, name=Bob, order_id=11, product=Mouse
user_id=2, name=Bob, order_id=12, product=Keyboard
user_id=3, name=Charlie, order_id=10, product=Laptop
user_id=3, name=Charlie, order_id=11, product=Mouse
user_id=3, name=Charlie, order_id=12, product=Keyboard

3 users × 3 orders = 9 строк

В Node.js:

const result = await userRepository
  .createQueryBuilder('user')
  .crossJoin('Order', 'order')
  .getMany();

// Эквивалент:
const result = await db.query(`
  SELECT * FROM users, orders
`);

Сравнение

АспектINNER JOINCROSS JOIN
УсловиеON (условие связи)Нет условия
Строк в результатеТолько совпадающиеВсе комбинации
Примерusers × matching ordersusers × ALL orders
ПроизводительностьХорошая (с индексом)Плохая (экспоненциально)
ИспользованиеЧастоеРедкое

Практические примеры

INNER JOIN (частый случай):

// Найти все заказы пользователя Alice
const orders = await db.query(`
  SELECT u.name, o.product
  FROM users u
  INNER JOIN orders o ON u.id = o.user_id
  WHERE u.name = 'Alice'
`);
// Результат: только заказы Alice

CROSS JOIN (редкий, но нужный):

// Создать матрицу всех возможных комбинаций
// Например: все дни × все продукты = график отпусков
const schedule = await db.query(`
  SELECT d.date, p.product_name
  FROM dates d
  CROSS JOIN products p
`);
// Результат: все дни × все продукты

// Или: все пользователи × все курсы (показать, какие НЕ записаны)
const allCombinations = await db.query(`
  SELECT u.id, c.id
  FROM users u
  CROSS JOIN courses c
  WHERE NOT EXISTS (
    SELECT 1 FROM enrollments e
    WHERE e.user_id = u.id AND e.course_id = c.id
  )
`);

Опасность CROSS JOIN

Экспоненциальный рост:

// 1000 users × 1000 orders = 1,000,000 rows!
const result = await db.query(`
  SELECT * FROM users
  CROSS JOIN orders
`);
// Может привести к:
// - Переполнению памяти
// - Timeout
// - Блокировке БД

Пример ошибки:

// ❌ Забыл INNER, случайно CROSS JOIN
const result = await db.query(`
  SELECT * FROM users, orders  -- CROSS JOIN!
`);
// Мог хотеть:
const result = await db.query(`
  SELECT * FROM users
  INNER JOIN orders ON users.id = orders.user_id
`);

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

INNER JOIN:

  • Нужны только связанные записи
  • Связь между таблицами по ID
  • Фильтрация по условию связи
  • 99% всех JOIN операций

CROSS JOIN:

  • Нужны все комбинации
  • Генерация расписаний
  • Матричные отчёты
  • Поиск отсутствующих комбинаций
  • Использовать осторожно (проверить размер результата!)

Вывод

INNER JOIN - выбираешь строки, где есть связь CROSS JOIN - создаёшь все возможные комбинации (редко нужно!)

В чем разница между CROSS JOIN и INNER JOIN? | PrepBro