JOINНачальный
INNER JOIN
Возвращает только строки, у которых есть совпадение в обеих таблицах.
Синтаксис
SELECT ... FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id;
Объяснение
INNER JOIN — самый распространённый тип соединения. Строки без пары в другой таблице не попадают в результат.
Производительность: всегда добавляй индекс на колонку соединения (обычно foreign key). JOIN без индекса = вложенные циклы O(n*m).
Пример
-- Заказы с информацией о покупателе SELECT o.id, o.total, u.name, u.email FROM orders o INNER JOIN users u ON u.id = o.user_id WHERE o.status = 'paid';
Связанные термины
CROSS JOINДекартово произведение двух таблиц: каждая строка первой соединяется с каждой строкой второй.FULL OUTER JOINВозвращает все строки из обеих таблиц. Где нет совпадения — NULL с соответствующей стороны.LEFT JOINВозвращает все строки из левой таблицы. Для строк без пары в правой — NULL.RIGHT JOINВозвращает все строки из правой таблицы. Для строк без пары в левой — NULL.
Анекдоты по теме
— Какая разница между INNER JOIN и дружбой? — INNER JOIN рвётся, если нет совпадений. А дружба — LEFT JOIN. Даже когда вы не совпадаете, ты всё равно остаёшься в таблице.
Оптимизатор запросов видит запрос с 7 JOIN. Оптимизатор: интересно. Оптимизатор перебирает 5040 возможных порядков соединения. Оптимизатор: выбираю лучший. Разработчик: почему запрос планируется 2 секунды? Оптимизатор: ты написал 7 JOIN.
Разработчик пишет: SELECT * FROM a JOIN b ON a.id = b.a_id JOIN c ON b.id = c.b_id JOIN d ON c.id = d.c_id JOIN e ON d.id = e.d_id JOIN f ON e.id = f.e_id DBA: ты только что создал цепочку из 6 JOIN. Разработчик: и что? DBA: надеюсь, у тебя везде есть индексы.