← Назад к вопросам
В чем разница между 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 JOIN | CROSS JOIN |
|---|---|---|
| Условие | ON (условие связи) | Нет условия |
| Строк в результате | Только совпадающие | Все комбинации |
| Пример | users × matching orders | users × 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 - создаёшь все возможные комбинации (редко нужно!)