Урок 9: Объединение Таблиц — Искусство SQL-Сватовства!
Добро пожаловать обратно, любитель баз данных! Сегодня мы погружаемся в мир join’ов — способ, которым SQL сводит таблицы друг с другом, как опытный сваха, который точно знает, какие таблицы созданы друг для друга. Будь то объединение сотрудников с отделами или героев с их эпическими заданиями, освоение join’ов сделает ваши запросы в PostgreSQL настоящей симфонией отношений.
Приготовьтесь к сватовству для ваших данных!
Что Такое Join?
Join в SQL — это как устроить свидание вслепую между двумя таблицами. Вы просите PostgreSQL соединить связанные данные, обеспечивая, чтобы строки одной таблицы совпали со строками другой, основываясь на каком-то общем значении (например, ID, имя или любовь к котам… хотя, скорее всего, просто ID).
Существует несколько типов join’ов, каждый со своим “характером отношений” — от гармоничного inner join до более сложных outer join’ов. Давайте их познакомим!
1. Inner Join — Идеальная Пара
Inner join — это SQL-эквивалент найти свою идеальную пару на первом свидании. Он возвращает только те строки, где обе таблицы имеют совпадающие значения в указанных столбцах. Если совпадений нет, эти строки остаются в стороне.
Проще говоря: “Есть что-то общее? Отлично, у вас всё получится!”
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
В этом запросе PostgreSQL покажет только тех сотрудников, у которых есть подходящий отдел. Нет отдела? Нет и строки!
2. Left Join (или Left Outer Join) — Щедрый Друг
Left join — это как друг, который всегда следит за тем, чтобы никто не остался позади. Он возвращает все строки из левой таблицы (той, что первой в списке), даже если в правой таблице нет совпадений. Если совпадений нет, PostgreSQL любезно заполняет пустые места значением NULL
.
Короче говоря: “Мне всё равно, занята ли правая таблица — я всё равно возьму все строки с левой!”
SELECT герои.name, задания.quest_name
FROM герои
LEFT JOIN задания
ON герои.quest_id = задания.id;
С этим запросом даже если у героя ещё нет назначенного задания, он всё равно появится, только с пустым местом там, где должно быть название задания (где-то на фоне звучит Тейлор Свифт).
3. Right Join (или Right Outer Join) — Надёжный Саппорт
Right join — это брат left join’а, но с другой стороны. Он возвращает все строки из правой таблицы, даже если в левой таблице нет совпадений. Если правая таблица имеет лишние строки, которые не совпадают с левой, они всё равно будут включены.
Это как сказать: “Эй, правая таблица, мы тебя прикроем, что бы ни случилось.”
SELECT задания.quest_name, герои.name
FROM задания
RIGHT JOIN герои
ON задания.id = герои.quest_id;
Здесь, если задание ещё не назначено герою, оно всё равно появится. Возможно, оно просто ждёт своего следующего смельчака!
4. Full Outer Join — Открытый Приглашатель
Full outer join — это SQL-версия открытого приглашения на вечеринку. Он возвращает все строки, где есть совпадение в одной из таблиц, а если совпадений нет, PostgreSQL просто заполняет NULL
. Все приглашаются, независимо от того, нашли ли они себе пару.
Проще говоря: “Все входим! Есть совпадение — отлично, нет — тоже пойдёт.”
SELECT герои.name, задания.quest_name
FROM герои
FULL OUTER JOIN задания
ON герои.quest_id = задания.id;
С этим запросом вы получаете всех героев и все задания, даже если некоторые герои просто ждут своих великих приключений, а некоторые задания отчаянно ищут героя. Идеальный рецепт для агентства по подбору квестов!
Использование Join с Несколькими Таблицами
Зачем ограничиваться двумя таблицами? Иногда SQL хочет устроить сватовство сразу для нескольких таблиц. Когда нужно объединить три или больше таблиц, PostgreSQL с радостью поможет. Просто продолжайте цепочку join’ов!
SELECT герои.name, задания.quest_name, королевства.kingdom_name
FROM герои
JOIN задания ON герои.quest_id = задания.id
JOIN королевства ON герои.kingdom_id = королевства.id;
В этом случае вы объединяете героев, их задания и королевства, к которым они принадлежат — как организовать королевскую вечеринку с правильными приглашениями!
Self Join — Когда Таблицы Разговаривают Сами с Собой
Self join — это SQL-версия “поговорить с самим собой”. Вы объединяете таблицу с самой собой, обычно для сравнения строк в той же таблице. Представьте таблицу заданий, где каждое задание имеет следующее — вы можете использовать self join, чтобы увидеть, какие задания связаны.
SELECT z1.quest_name AS оригинальное_задание, z2.quest_name AS следующее_задание
FROM задания z1
JOIN задания z2 ON z1.next_quest_id = z2.id;
Здесь PostgreSQL сопоставит каждое задание с его последующим, создавая список эпических приключений, которые следуют друг за другом!
Cross Join — Все Приглашены!
Cross join — это SQL-эквивалент свалить всех в одну комнату и посмотреть, что будет. Он объединяет каждую строку из левой таблицы с каждой строкой из правой таблицы — и результат может быть… огромным. Вы получаете все возможные комбинации, что иногда полезно, но чаще всего довольно хаотично.
SELECT герои.name, оружие.weapon_name
FROM герои
CROSS JOIN оружие;
Теперь у вас есть каждый герой с каждым возможным оружием — мечта воина или головная боль для базы данных!
Чему Мы Сегодня Научились?
Сегодня мы научились объединять таблицы и создавать гармоничные отношения через:
- Inner join: Где выживают только идеальные пары.
- Left и right join: Потому что иногда приятно выбрать любимчика.
- Full outer join: Когда хочется включить всех, даже если они не подходят.
- Self join: Когда таблицы хотят поболтать сами с собой.
- Cross join: Потому что иногда хаос — это весело!
Что Дальше?
В следующий раз мы погрузимся в В оконные функции — это элегантный способ вычислять промежуточные итоги, рейтинги и многое другое! Готовьтесь к апгрейду запросов на уровне королевского приёма.
А теперь вперёд, и пусть ваши join’ы всегда соединяют правильные таблицы!