Урок 9: Объединение Таблиц — Искусство SQL-Сватовства!


Lesson 9

Урок 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’ы всегда соединяют правильные таблицы!