Ответ
В SQL операции JOIN используются для объединения строк из двух или более таблиц на основе связанного столбца. Основные виды:
-
INNER JOIN(или простоJOIN): Возвращает только те строки, для которых есть совпадение в обеих таблицах.SELECT employees.name, departments.name FROM employees INNER JOIN departments ON employees.department_id = departments.id; -
LEFT (OUTER) JOIN: Возвращает все строки из левой (первой) таблицы и соответствующие строки из правой. Если совпадения нет, поля из правой таблицы будутNULL.SELECT employees.name, projects.title FROM employees LEFT JOIN projects ON employees.id = projects.lead_id; -- Покажет всех сотрудников, даже тех, кто не ведёт проект -
RIGHT (OUTER) JOIN: АналогиченLEFT JOIN, но приоритет отдан правой таблице. Возвращает все строки из правой таблицы и совпадения из левой. -
FULL (OUTER) JOIN: Возвращает все строки из обеих таблиц. Если для строки из одной таблицы нет совпадения в другой, недостающие поля заполняютсяNULL. -
CROSS JOIN: Возвращает декартово произведение таблиц — каждая строка первой таблицы соединяется с каждой строкой второй. Может генерировать очень большие результирующие наборы.SELECT sizes.size, colors.color FROM sizes CROSS JOIN colors; -- Создаст все возможные комбинации размеров и цветов -
SELF JOIN: Технически это обычныйJOINтаблицы с самой собой. Часто используется для работы с иерархическими данными (например, таблица сотрудников с полемmanager_id).SELECT e1.name AS Employee, e2.name AS Manager FROM employees e1 LEFT JOIN employees e2 ON e1.manager_id = e2.id;
Ответ 18+ 🔞
А, SQL JOIN'ы, ёпта! Ну, это как если бы ты в баре пытался понять, кто с кем пришёл и кто кому должен за пиво. Сейчас разжуём.
Смотри, есть у тебя таблицы — как отдельные кучки людей. JOIN — это когда ты их начинаешь сводить по какому-то признаку, типа «у кого одинаковые бейджики от одной конторы».
INNER JOIN (или просто JOIN) — это самый строгий, блядь, тусовщик. Берёт только тех, у кого есть пара. Если у человека из левой таблицы нет брата-близнеца в правой — его нахуй выкидывают из итоговой вечеринки. Чистая элита совпадений.
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
Вот тут выведутся только сотрудники, у которых отдел реально существует. Безотцовщина не пройдёт.
LEFT JOIN — это уже по-нашему, по-человечески. Он берёт всех чуваков из левой таблицы (первой, которую написал), и пытается к ним пристегнуть данные из правой. Не нашёл пару? Да и хуй с ним, оставит поля пустыми (NULL). Главное — левые не потеряются.
SELECT employees.name, projects.title
FROM employees
LEFT JOIN projects ON employees.id = projects.lead_id;
-- Покажет всех сотрудников, даже тех, кто не ведёт проект
Вот это — жизнь. Видно и героев труда, и лодырей, которые проект не ведут. Справа у лодырей будет NULL.
RIGHT JOIN — это тот же левый, только наоборот. Всех из правой таблицы тащит, а к ним лепят что слева. Используется реже, потому что обычно можно таблицы местами поменять и сделать LEFT JOIN — так голова меньше болит.
FULL JOIN — это, бля, полный бардак. Он вываливает на тебя вообще всех с обеих сторон. Был совместимый друг — хорошо. Не было — поля так и останутся пустыми с той или иной стороны. Полная картина, но часто — пиздец как много строк.
CROSS JOIN — это, ядрёна вошь, адский механизм. Он тупо берёт каждую строчку из первой таблицы и соединяет с КАЖДОЙ строчкой из второй. Если в первой таблице 100 строк, а во второй 1000 — получишь 100 000 строк, ебать копать! Полезно только для каких-то суперспецифичных задач, типа генерации всех комбинаций размеров и цветов.
SELECT sizes.size, colors.color
FROM sizes
CROSS JOIN colors;
-- Создаст все возможные комбинации размеров и цветов
Будь с ним осторожен, а то сервак взвоет.
SELF JOIN — звучит умно, а на деле просто таблица сама с собой знакомится. Чаще всего, чтобы найти кто чей начальник в одной таблице сотрудников.
SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
Вот смотри: ты берёшь таблицу employees, даёшь ей псевдоним e1 (это сами сотрудники), и соединяешь её с той же таблицей, но под псевдонимом e2 (это начальники). Связываешь по полю manager_id. И вуаля — видишь, кто кем рулит. Если начальника нет (NULL) — LEFT JOIN покажет сотрудника всё равно, а графа «Manager» будет пустой. Красота!
Вот и вся магия. Главное — понять, кого ты хочешь видеть в результате: только парочек (INNER), всех левых и их подруг (LEFT), или устроить тотальную сходку всех со всеми (CROSS), после которой терпения ебать ноль.