Ответ
Оператор JOIN в SQL используется для объединения строк из двух или более таблиц на основе логической связи между ними.
Структура JOIN-запроса:
- Ключевое слово типа соединения:
INNER,LEFT [OUTER],RIGHT [OUTER],FULL [OUTER],CROSS. - Имя присоединяемой таблицы.
- Условие соединения: Ключевое слово
ONс предикатом илиUSINGдля столбцов с одинаковыми именами.
Основные типы JOIN:
-
INNER JOIN: Возвращает только строки, где есть совпадение в обеих таблицах.SELECT orders.id, customers.name FROM orders INNER JOIN customers ON orders.customer_id = customers.id; -
LEFT (OUTER) JOIN: Возвращает все строки из левой таблицы и совпадающие из правой. При отсутствии совпадения поля правой таблицы будутNULL.SELECT employees.name, departments.name AS dept_name FROM employees LEFT JOIN departments ON employees.dept_id = departments.id; -
RIGHT JOINиFULL JOIN: АналогичныLEFT JOIN, но приоритет отдается правой таблице или возвращаются все строки из обеих таблиц соответственно. -
CROSS JOIN: Возвращает декартово произведение (все возможные комбинации строк). -
SELF JOIN: Соединение таблицы с самой собой (требуется использование псевдонимов).SELECT e1.name AS employee, e2.name AS manager FROM employees e1 LEFT JOIN employees e2 ON e1.manager_id = e2.id;
Почему важен правильный выбор типа JOIN? INNER JOIN фильтрует данные, а LEFT JOIN сохраняет все записи основной таблицы, что критично для отчетов, где нужно видеть все сущности, даже без связанных данных.
Ответ 18+ 🔞
Давай разжую тебе про эти ваши JOIN'ы, а то смотрю, народ путается, как в тёмной комнате хуй с пальцем. Представь, что у тебя есть две таблицы — как два стола с бумажками. На одном — заказы, на другом — клиенты. И тебе надо их склеить, чтобы понять, кто что заказал. Вот для этого и нужен JOIN, а не чтобы мозги ебать.
Смотри, структура проще, чем кажется:
- Сначала говоришь, как склеивать:
INNER,LEFT,RIGHT,FULLилиCROSS(последний — это вообще отдельная песня, про него позже). - Потом — какую таблицу присобачиваем.
- И наконец, по какому признаку их сродняешь: через
ONс условием илиUSING, если столбцы называются одинаково.
Основные типы, без которых нихуя не сделаешь:
-
INNER JOIN: Самый частый, жадный до совпадений. Берёт только те строки, где есть связь в обеих таблицах. Если у заказа нет клиента или у клиента нет заказов — нихуя не увидишь.SELECT orders.id, customers.name FROM orders INNER JOIN customers ON orders.customer_id = customers.id; -
LEFT JOIN: Вот это уже интереснее. Он возвращает всё из левой таблицы (той, что вFROM), а из правой — только то, что совпало. Нет совпадения? ПолучаешьNULL, и сидишь думаешь, почему этот сотрудник без отдела, как манда с ушами.SELECT employees.name, departments.name AS dept_name FROM employees LEFT JOIN departments ON employees.dept_id = departments.id; -
RIGHT JOINиFULL JOIN:RIGHT— это тот жеLEFT, только наоборот, приоритет правой таблице. АFULL— вообще анархист, выдаёт всё из обеих, совпало там что-то или нет. В жизниRIGHTиспользуют редко, потому что можно просто таблицы местами поменять и сделатьLEFT. -
CROSS JOIN: О, это ебать мои старые костыли! Декартово произведение, блядь. Каждую строку из первой таблицы соединяет с каждой строкой из второй. Получается овердохуища записей. Полезно, только если ты специально хочешь сгенерировать все возможные комбинации, а не просто так, от нехуй делать. -
SELF JOIN: Когда таблица должна соединиться сама с собой. Например, чтобы найти, кто чей начальник. Без псевдонимов (aliases) тут вообще нихуя не получится, запутаешься, как муха в паутине.SELECT e1.name AS employee, e2.name AS manager FROM employees e1 LEFT JOIN employees e2 ON e1.manager_id = e2.id;
А теперь главное, нахуй: выбор типа JOIN — это не просто так, "а давайте вот это". Если выберешь INNER, когда нужен LEFT, ты потеряешь кучу данных, которые просто не совпали. Например, всех клиентов, которые ещё ничего не купили. А если наоборот, LEFT вместо INNER, — натащишь кучу NULL'ов и потом будешь ебаться с фильтрацией. Так что думай, что тебе нужно: строгий отбор совпадений или сохранение всей исходной картины, даже с дырами.