Урок 3: Joins та Відносини — Змусимо Таблиці Теревенити!
Ласкаво просимо знову, сміливий лицар даних! Тепер, коли ти вже знаєш, як створювати та керувати своїми таблицями, час додати їм трохи соціальних навичок. Зрештою, таблиці — це не просто купа рядків та стовпчиків, які сидять у своїх фортецях, намагаючись не дивитися одна на одну через рів. Ні! Вони мають спілкуватися! Сьогодні ми зануримося у світ Joins та Відносин — щось на кшталт “Танців із таблицями”, де кожна з них обирає свого партнера для танцю!
Що таке Join?
Якщо говорити просто, Join — це спосіб сказати PostgreSQL: “Гей, з’єднай цих двох, вони ж старі друзі!” Joins дозволяють об’єднувати дані з двох або більше таблиць на основі спільного стовпця. Уяви, що ти організовуєш вечерю, де кожен стіл має унікальний список гостей, але всі так чи інакше пов’язані (наприклад, усі обожнюють вареники з вишнями).
Типи Joins: Хто з Ким Балакатиме?
Є кілька типів joins, кожен із своїм характером. Давай розглянемо ці “танці”:
- INNER JOIN: “Зустрічаємося, якщо є щось спільне”.
- LEFT JOIN: “Усі з лівого столу заходять, а з правого запросимо лише тих, хто підходить.”
- RIGHT JOIN: Зворотний варіант LEFT JOIN — на першому місці правий стіл, а лівий з’явиться, якщо буде щасливий.
- 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
? Ось тут починається магія відносин.
- Первинний Ключ (Primary Key): Це як паспорт лицаря. Унікально ідентифікує кожен рядок у таблиці. У нашому випадку,
lytsari.id
— це первинний ключ. - Зовнішній Ключ (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 будуть завжди швидкими, а результати — точними!