Урок 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 heroes.name, quests.quest_name
FROM heroes
LEFT JOIN quests
ON heroes.quest_id = quests.id;

У цьому запиті, навіть якщо герой ще не отримав завдання, він все одно з’явиться у результатах, але замість імені завдання буде порожнє місце (згадаємо Тейлор Свіфт).

3. Right Join (або Right Outer Join) — Підтримуючий Брат

Right join — це брат left join’у, але з іншого боку. Він повертає всі рядки з правої таблиці, навіть якщо немає співпадінь у лівій таблиці. Отже, якщо права таблиця має зайві рядки, які не співпадають з лівою, вони все одно будуть включені.

Це як сказати: “Ей, права таблице, ми прикриємо тебе, що б не сталося.”

SELECT quests.quest_name, heroes.name
FROM quests
RIGHT JOIN heroes
ON quests.id = heroes.quest_id;

Тут, якщо завдання ще не було призначене герою, воно все одно з’явиться. Можливо, воно просто чекає свого наступного сміливця!

4. Full Outer Join — Повний Демократ

Full outer join — це SQL-версія відкритого запрошення на вечірку. Він повертає всі рядки, де є співпадіння в одній з таблиць, а якщо співпадінь немає, PostgreSQL просто вставляє NULL. Всі можуть прийти на вечірку, незалежно від того, знайшли вони собі пару чи ні.

По суті: “Заходьте всі! Є співпадіння — чудово, немає — теж нормально.”

SELECT heroes.name, quests.quest_name
FROM heroes
FULL OUTER JOIN quests
ON heroes.quest_id = quests.id;

З цим запитом ви отримуєте всіх героїв і всі завдання, навіть якщо деякі герої просто чекають на свою пригоду, а деякі завдання шукають відчайдушного героя. Ідеальний рецепт для агентства з пошуку пригод!

Використання Join з Кількома Таблицями

Навіщо обмежуватися двома таблицями? Іноді SQL хоче бути сватом для кількох таблиць одразу. Коли вам потрібно об’єднати три або більше таблиць, PostgreSQL з радістю допоможе. Просто продовжуйте ланцюжок join’ів!

SELECT heroes.name, quests.quest_name, kingdoms.kingdom_name
FROM heroes
JOIN quests ON heroes.quest_id = quests.id
JOIN kingdoms ON heroes.kingdom_id = kingdoms.id;

У цьому випадку ви об’єднуєте героїв, їхні завдання і королівства, до яких вони належать — як організовувати королівську подію з усіма правильними запрошеннями!

Self Join — Коли Таблиці Хочуть Поговорити Самі з Собою

Self join — це SQL-версія “говорити самому з собою”. Ви об’єднуєте таблицю з самою собою, зазвичай для порівняння рядків у тій самій таблиці. Уявіть таблицю завдань, де кожне завдання має наступне завдання — ви можете використати self join, щоб побачити, які завдання пов’язані між собою.

SELECT z1.quest_name AS оригінальне_завдання, z2.quest_name AS наступне_завдання
FROM quests z1
JOIN quests z2 ON z1.next_quest_id = z2.id;

Тут PostgreSQL зіставить кожне завдання з його наступним, створюючи список епічних пригод, які перетікають одна в іншу!

Cross Join — Усі Запрошені!

Cross join — це SQL-еквівалент кинутого виклику: хто з ким опиниться в одній кімнаті? Він поєднує кожен рядок лівої таблиці з кожним рядком правої таблиці — і результат може бути… величезним. Ви отримуєте всі можливі комбінації, що інколи корисно, але часто трохи хаотично.

SELECT heroes.name, weapons.weapon_name
FROM heroes
CROSS JOIN weapons;

Тепер у вас є кожен герой з кожною можливою зброєю — мрія воїна, або жах для бази даних!

Що Ми Сьогодні Вивчили?

Сьогодні ми дізналися, як об’єднувати таблиці та створювати гармонійні стосунки за допомогою:

  • Inner join: Де виживають лише ідеальні пари.
  • Left і right join: Бо іноді приємно надавати перевагу.
  • Full outer join: Коли хочеться включити всіх, навіть тих, хто не підходить.
  • Self join: Коли таблиці хочуть трохи побалакати між собою.
  • Cross join: Бо інколи хаос буває веселим!

Що Далі?

Наступного разу ми зануримося у Віконні Функції — це модний спосіб обчислювати підсумки, рейтинги та багато іншого! Приготуйтеся оновити свої запити так, як вони цього заслуговують — на рівень королівського класу.


А тепер вперед, і нехай ваші join’и завжди поєднують правильні таблиці!