Урок 3: Joins та Відносини — Змусимо Таблиці Теревенити!


Lesson3

Урок 3: Joins та Відносини — Змусимо Таблиці Теревенити!

Ласкаво просимо знову, сміливий лицар даних! Тепер, коли ти вже знаєш, як створювати та керувати своїми таблицями, час додати їм трохи соціальних навичок. Зрештою, таблиці — це не просто купа рядків та стовпчиків, які сидять у своїх фортецях, намагаючись не дивитися одна на одну через рів. Ні! Вони мають спілкуватися! Сьогодні ми зануримося у світ Joins та Відносин — щось на кшталт “Танців із таблицями”, де кожна з них обирає свого партнера для танцю!

Що таке Join?

Якщо говорити просто, Join — це спосіб сказати PostgreSQL: “Гей, з’єднай цих двох, вони ж старі друзі!” Joins дозволяють об’єднувати дані з двох або більше таблиць на основі спільного стовпця. Уяви, що ти організовуєш вечерю, де кожен стіл має унікальний список гостей, але всі так чи інакше пов’язані (наприклад, усі обожнюють вареники з вишнями).

Типи Joins: Хто з Ким Балакатиме?

Є кілька типів joins, кожен із своїм характером. Давай розглянемо ці “танці”:

  1. INNER JOIN: “Зустрічаємося, якщо є щось спільне”.
  2. LEFT JOIN: “Усі з лівого столу заходять, а з правого запросимо лише тих, хто підходить.”
  3. RIGHT JOIN: Зворотний варіант LEFT JOIN — на першому місці правий стіл, а лівий з’явиться, якщо буде щасливий.
  4. FULL OUTER JOIN: “Запрошуємо всіх, навіть сусідів!”

Погляньмо, як вони працюють на практиці!

1. INNER JOIN: Лише для Обраних

INNER JOIN повертає лише ті рядки, які мають відповідні значення в обох таблицях. Уяви, що в тебе є таблиця lytsari і таблиця misiyi. Таблиця lytsari містить усіх лицарів, а таблиця misiyi — список місій, на які вони записалися:

CREATE TABLE lytsari (
    id SERIAL PRIMARY KEY,
    imya VARCHAR(100),
    korolivstvo VARCHAR(50)
);

CREATE TABLE misiyi (
    id SERIAL PRIMARY KEY,
    lytsar_id INT,
    nazva_misiyi VARCHAR(100)
);

Тепер дізнаємося, які лицарі приєдналися до місій:

SELECT lytsari.imya, misiyi.nazva_misiyi
FROM lytsari
INNER JOIN misiyi
ON lytsari.id = misiyi.lytsar_id;

Цей запит поверне список лицарів, які зараз зайняті місіями. Якщо лицар просто сидить у Камелоті, п’ючи чай, його тут не побачиш. (Вибач, Сер Ланцелоте, треба щось робити!)

2. LEFT JOIN: Гостинний Господар

LEFT JOIN повертає всі рядки з лівої таблиці (lytsari), а також відповідні рядки з правої таблиці (misiyi). Якщо немає збігів, результат буде NULL для стовпчиків правої таблиці. Це як запросити всіх лицарів на вечірку та подивитися, хто з них насправді зайнятий.

SELECT lytsari.imya, misiyi.nazva_misiyi
FROM lytsari
LEFT JOIN misiyi
ON lytsari.id = misiyi.lytsar_id;

Тепер навіть якщо лицар просто сидить та полірує свій шолом, він з’явиться у списку — але з NULL замість місії. Трохи сумно, але що поробиш.

3. RIGHT JOIN: Перевернемо Ситуацію

RIGHT JOIN робить навпаки — повертає всі рядки з правої таблиці (misiyi) і відповідні рядки з лівої таблиці (lytsari). Це як запитати: “Які місії доступні та хто достатньо хоробрий, щоб узятися за них?”

SELECT lytsari.imya, misiyi.nazva_misiyi
FROM lytsari
RIGHT JOIN misiyi
ON lytsari.id = misiyi.lytsar_id;

Це покаже всі місії, навіть якщо деякі з них просто чекають, поки якийсь лицар з’явиться.

4. FULL OUTER JOIN: Свято для Всіх!

FULL OUTER JOIN повертає всі рядки, коли є збіги в будь-якій таблиці. Якщо збігу немає — побачиш NULL. Це як запросити всіх на шашлики, навіть якщо ніхто не знає, хто приніс м’ясо!

SELECT lytsari.imya, misiyi.nazva_misiyi
FROM lytsari
FULL OUTER JOIN misiyi
ON lytsari.id = misiyi.lytsar_id;

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

Побудова Відносин: Первинні та Зовнішні Ключі

Отже, як ми кажемо PostgreSQL, що lytsar_id у таблиці misiyi пов’язаний із id у таблиці lytsari? Ось тут починається магія відносин.

  1. Первинний Ключ (Primary Key): Це як паспорт лицаря. Унікально ідентифікує кожен рядок у таблиці. У нашому випадку, lytsari.id — це первинний ключ.
  2. Зовнішній Ключ (Foreign Key): Це як вхідний квиток на турнір. Він посилається на первинний ключ в іншій таблиці. Тут misiyi.lytsar_id — це зовнішній ключ, який посилається на lytsari.id.

Офіційно Задати Зовнішній Ключ

Давай формалізуємо, додавши обмеження зовнішнього ключа до misiyi:

ALTER TABLE misiyi
ADD CONSTRAINT fk_lytsar
FOREIGN KEY (lytsar_id)
REFERENCES lytsari(id);

Тепер PostgreSQL знає, що misiyi.lytsar_id має відповідати lytsari.id. Якщо спробуєш створити місію для неіснуючого лицаря, PostgreSQL зупинить тебе швидше, ніж вогнедишний дракон!

Підсумуємо: Що Ми Сьогодні Вивчили?

Сьогодні ми розглянули:

  • INNER JOIN: Повертає рядки з обох таблиць, якщо є збіг.
  • LEFT JOIN: Повертає всі рядки з лівої таблиці, навіть якщо справа порожньо.
  • RIGHT JOIN: Повертає всі рядки з правої таблиці.
  • FULL OUTER JOIN: Усі запрошені, навіть ті, хто запізнився!

Нехай твої Joins будуть завжди швидкими, а результати — точними!