Урок 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’и завжди поєднують правильні таблиці!