ЛЕКЦІЯ 15

JOIN: логіка об'єднань

Основи баз даних

VTFK • 2025

Що вже вивчили

Лекція 14: ORDER BY

  • ASC/DESC сортування
  • LIMIT та OFFSET
  • Багатоколоночне сортування

План лекції

  • Навіщо JOIN потрібен
  • Реляційна логіка
  • ON умови
  • Cardinality та типи

Фокус: об'єднання даних з кількох таблиць

Проблема без JOIN

JOIN

Join Operation

Поєднання рядків з двох або більш таблиць за спільним умовам (зазвичай FK/PK).

Аналогія: Як скріпити два документи разом по номеру посилання

Концепція JOIN

Як поєднуються таблиці

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% erDiagram Users ||--o{ Orders : PK->FK Users { int id; string name } Orders { int id; int user_id; string item } note"JOIN orders ON orders.user_id = users.id"

Чому реляційні БД використовують JOIN

Базовий JOIN синтаксис

SELECT columns FROM table1 JOIN table2 ON table1.id = table2.table1_id;
table1 — ліва таблиця
table2 — права таблиця
ON — умова об'єднання (зазвичай FK = PK)
table1 — ліва таблиця
table2 — права таблиця
ON — умова об'єднання (зазвичай FK = PK)
table1 — ліва таблиця
table2 — права таблиця
ON — умова об'єднання (зазвичай FK = PK)

Tipos de JOIN (скорочено)

Тип Завдання
INNER JOIN Тільки спільні рядки
LEFT JOIN Все з лівої + спільні
RIGHT JOIN Все з правої + спільні
FULL OUTER JOIN Все з обох
CROSS JOIN Декартів добуток

Типи JOIN - Venn діаграми

Інтерпретація результатів

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart LR A[Users] B[Orders] A --> Inner[INNER JOIN
спільні] A --> Left[LEFT JOIN
users +
спільні orders] A --> Right[RIGHT JOIN
orders +
спільні users] A --> Full[FULL OUTER
все з обох]

ON умова у JOIN

Перший JOIN запит

Користувачі та їх замовлення

SELECT 
  users.id,
  users.name,
  orders.id AS order_id,
  orders.item
FROM users
INNER JOIN orders ON users.id = orders.user_id;

-- Результат:
-- id | name  | order_id | item
-- 1  | Alice | 101      | Laptop
-- 1  | Alice | 102      | Mouse
-- 2  | Bob   | 103      | Keyboard

Aliasing для читабельності

JOIN з alias

Коротко та читабельно

SELECT 
  u.id AS user_id,
  u.name AS user_name,
  o.id AS order_id,
  o.item
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE u.active = true
ORDER BY u.name;

Міні-вікторина

Що означає INNER JOIN?

  • Усі рядки з лівої таблиці
  • Тільки рядки, які зустрічаються в обох таблицях
  • Усі рядки з обох таблиць
✅ Правильна відповідь: Тільки рядки, які зустрічаються в обох таблицях
💡 Пояснення:

INNER JOIN дає перетин: рядки які існують в обох таблицях.

Помилка: забути ON

⚠️ ЗАСТЕРЕЖЕННЯ

Без ON отримуємо CROSS JOIN - Декартів добуток

❌ Неправильно

SELECT * FROM users, orders;  -- 1000 × 500 = 500,000 рядків!

Без ON кожен рядок користувача поєднується з кожним замовленням

✓ Правильно

SELECT * FROM users
INNER JOIN orders ON users.id = orders.user_id;

ON вказує спільну колонку для об'єднання

Cardinality відносин

1:N відношення (найпоширеніше)

Один користувач, багато замовлень

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% erDiagram Users ||--o{ Orders : "1:N" Users { int id; string name } Orders { int id; int user_id; string item } note "Один користувач может мати 0, 1, або більше замовлень"

Історія JOIN

Від реляційної логіки

1974

SQL JOIN

Перша реалізація

1992

SQL-92

LEFT/RIGHT JOIN стандартизація

2003

FULL OUTER

Додано FULL OUTER JOIN

2025

Query optimizer

Розумний вибір порядку

Best practices для JOIN

Міні ТЗ: користувачі та замовлення

Комплексний JOIN

Кілька таблиць разом

SELECT 
  u.name AS user_name,
  COUNT(o.id) AS order_count,
  SUM(p.price) AS total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN products p ON o.product_id = p.id
WHERE u.active = true
GROUP BY u.id
ORDER BY total_spent DESC;

Підсумки

  • JOIN поєднує дані з кількох таблиць
  • ON вказує умову об'єднання
  • INNER, LEFT, RIGHT, FULL - різні типи

Далі — конкретні типи JOIN

Домашнє завдання

Наступна лекція:

Лекція 16: Типи JOIN

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій