Ответ
Операция JOIN используется для объединения строк из двух или более таблиц на основе связанного столбца. Основные типы:
Основные JOIN-операции
-
INNER JOIN
- Возвращает только те строки, для которых условие соединения (
ON) истинно в обеих таблицах. - Это самый распространённый тип JOIN.
SELECT a.*, b.* FROM Orders a INNER JOIN Customers b ON a.CustomerId = b.Id; -- Результат: только заказы, у которых есть клиент.
- Возвращает только те строки, для которых условие соединения (
-
LEFT (OUTER) JOIN
- Возвращает все строки из левой (первой) таблицы и совпадающие строки из правой. Если совпадения нет, для столбцов правой таблицы возвращается
NULL.SELECT a.*, b.* FROM Customers a LEFT JOIN Orders b ON a.Id = b.CustomerId; -- Результат: все клиенты, даже те, у которых нет заказов.
- Возвращает все строки из левой (первой) таблицы и совпадающие строки из правой. Если совпадения нет, для столбцов правой таблицы возвращается
-
RIGHT (OUTER) JOIN
- Обратный
LEFT JOIN. Возвращает все строки из правой таблицы и совпадающие из левой. Используется реже, так как запрос обычно можно переписать сLEFT JOIN, поменяв таблицы местами.
- Обратный
-
FULL (OUTER) JOIN
- Возвращает все строки из обеих таблиц. Если совпадение есть, строки объединяются. Если совпадения для строки из левой таблицы нет, столбцы правой будут
NULL, и наоборот.SELECT a.*, b.* FROM TableA a FULL OUTER JOIN TableB b ON a.Key = b.Key; -- Результат: все записи из A и B.
- Возвращает все строки из обеих таблиц. Если совпадение есть, строки объединяются. Если совпадения для строки из левой таблицы нет, столбцы правой будут
Специальные JOIN-операции
-
CROSS JOIN
- Возвращает декартово произведение таблиц: каждая строка первой таблицы соединяется с каждой строкой второй. Может генерировать очень большие результирующие наборы.
SELECT a.*, b.* FROM Colors a CROSS JOIN Sizes b; -- Результат: все комбинации цветов и размеров.
- Возвращает декартово произведение таблиц: каждая строка первой таблицы соединяется с каждой строкой второй. Может генерировать очень большие результирующие наборы.
-
SELF JOIN
- Соединение таблицы самой с собой. Полезно для работы с иерархическими данными (например, таблица сотрудников с полем
ManagerId).SELECT emp.Name AS Employee, mgr.Name AS Manager FROM Employees emp LEFT JOIN Employees mgr ON emp.ManagerId = mgr.Id;
- Соединение таблицы самой с собой. Полезно для работы с иерархическими данными (например, таблица сотрудников с полем
Ключевое отличие INNER от OUTER JOIN: INNER фильтрует результат по совпадению, OUTER сохраняет все строки из одной или обеих таблиц, заполняя пропуски NULL.
Ответ 18+ 🔞
Давай разберем эти ваши JOIN'ы, а то смотрю, народ путается, как слепой кот в сортире.
Смотри, представь, что у тебя есть две таблицы. Одна — это заказы, другая — клиенты. И их надо склеить, чтобы понять, кто что купил. Вот для этого вся эта движуха с JOIN и нужна.
Основные склейки, без которых нихуя не работает
-
INNER JOIN (Внутреннее соединение) Это как строгий бухгалтер. Берёт только те записи, где есть полное совпадение в обеих таблицах. Нет совпадения — нахуй такие строки, в результат не попадают.
SELECT a.*, b.* FROM Orders a INNER JOIN Customers b ON a.CustomerId = b.Id; -- Тут ты получишь ТОЛЬКО заказы, у которых в таблице клиентов есть родитель. Бездомные заказы, у которых CustomerId ведёт в пустоту, просто исчезнут, как твоя зарплата в конце месяца. -
LEFT JOIN (Левое соединение) А вот это уже поинтереснее. Он возвращает ВСЁ из левой таблицы (той, что в FROM). А из правой — только то, что подошло. Не подошло? Ну и хуй с ним, будет NULL.
SELECT a.*, b.* FROM Customers a LEFT JOIN Orders b ON a.Id = b.CustomerId; -- Здесь ты увидишь ВСЕХ клиентов, даже тех лодырей, которые нихуя не купили. У них в полях заказа будет красивый NULL. Удобно для отчётов "кто у нас вообще есть и кто из них хоть что-то делает". -
RIGHT JOIN (Правое соединение) Это тот же левый JOIN, только наоборот. Всё из правой таблицы, плюс что смогли найти в левой. Честно говоря, его нихуя не используют, потому что можно просто таблицы местами поменять и сделать LEFT JOIN — и все сразу поймут, что ты имел в виду.
-
FULL OUTER JOIN (Полное внешнее соединение) Это уже полный разгул демократии. "Хочу всё и сразу!" Берёт все записи из обеих таблиц. Нашёл совпадение — молодца, склеил. Не нашёл слева — оставил правую запись, а слева NULL. Не нашёл справа — оставил левую, справа NULL.
SELECT a.*, b.* FROM TableA a FULL OUTER JOIN TableB b ON a.Key = b.Key; -- Полная картина, все на свете связи и их отсутствие. Полезно, когда ищешь расхождения: "а что у нас есть в А, но нет в Б, и наоборот?".
Специальные приёмы для извращенцев
-
CROSS JOIN (Перекрёстное соединение) О, это мощная штука, с ней надо аккуратнее, чем с гранатой. Она делает декартово произведение. Проще говоря, каждую строку из первой таблицы приклеивает к КАЖДОЙ строке из второй. Таблица на 100 строк и таблица на 100 строк дадут тебе 10 тысяч строк результата. Можешь сервер положить, если не думаешь.
SELECT a.*, b.* FROM Colors a CROSS JOIN Sizes b; -- Классика: получишь все комбинации цветов и размеров. "Красный XL", "Красный L", "Синий XL" и так далее, пока не кончатся варианты. -
SELF JOIN (Самосоединение) Это когда таблица такая классная, что её можно склеить саму с собой. Представь таблицу сотрудников, где у каждого есть поле
ManagerId— айдишник его начальника, который тоже записан в этой же таблице. Как найти имя начальника для каждого?SELECT emp.Name AS Employee, mgr.Name AS Manager FROM Employees emp LEFT JOIN Employees mgr ON emp.ManagerId = mgr.Id; -- Берём таблицу Employees как бы два раза: один раз как "сотрудники" (emp), второй раз как "менеджеры" (mgr). И связываем айдишник менеджера у сотрудника с основным айдишником в той же таблице, но в роли менеджера. Голова может сломаться, но когда врубишься — красота.
Так в чём, блядь, главная разница между INNER и OUTER?
Да всё просто, как три копейки. INNER JOIN — это "только совпадения, остальное нахуй". OUTER JOIN (LEFT, RIGHT, FULL) — это "дайте мне всё из одной или обеих таблиц, а на отсутствие совпадений я посрать, отмечу NULL'ом и жить буду".
Вот и вся магия. Главное — не перепутать, когда тебе нужны все клиенты, а когда только те, кто что-то купил. А то получишь от начальства по шапке, ебать колотить.