ЛЕКЦІЯ 16

Типи JOIN: INNER/LEFT/RIGHT/SELF

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

VTFK • 2025

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

Лекція 15: JOIN логіка

  • Навіщо JOIN потрібен
  • ON умови
  • Cardinality відносин

План лекції

  • INNER JOIN (перетин)
  • LEFT JOIN (все з лівої)
  • RIGHT JOIN (все з правої)
  • SELF JOIN (таблиця з собою)

Фокус: 4 основні типи та їх практика

Чотири основні типи JOIN

INNER JOIN

Inner Join

Повертає тільки рядки де умова ON істинна у обох таблицях.

Аналогія: Перетин множин: результат = що є в обох

INNER JOIN - Venn діаграма

Спільна частина

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% graph TB A[Users
4 записи] B[Orders
5 записів] C[INNER JOIN
2 спільні] A -->|overlap| C B --> |overlap| C

INNER JOIN приклад

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

SELECT u.name, o.item
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- Результат:
-- name  | item
-- Alice | Laptop
-- Alice | Mouse
-- Bob   | Keyboard
-- (користувачі без замовлень виключені)

LEFT JOIN

Left Join

Повертає все з лівої таблиці + спільні рядки з правої. NULL для неспівпадаючих.

Аналогія: Всі з лівої щоб які порівні, з NULL замість даних правої

LEFT JOIN - Venn діаграма

Все з лівої + спільне

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% graph TB A[Users
4 записи] B[Orders
5 записів] C[LEFT JOIN
4 (усі users)
+ спільні orders] A --> |all + overlap| C

LEFT JOIN приклад

Усі користувачи з замовленнями (якщо є)

SELECT u.name, o.item
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

-- Результат:
-- name  | item
-- Alice | Laptop
-- Alice | Mouse
-- Bob   | Keyboard
-- Carol | NULL  (без замовлень)
-- (всі користувачи включені)

RIGHT JOIN

Right Join

Повертає все з правої таблиці + спільні рядки з лівої. NULL для неспівпадаючих.

Аналогія: Протилежність LEFT: все з правої, NULL з лівої

RIGHT JOIN приклад

Усі замовлення з користувачами (якщо потрібні)

SELECT u.name, o.item
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- Результат:
-- name   | item
-- Alice  | Laptop
-- Alice  | Mouse
-- Bob    | Keyboard
-- NULL   | Monitor  (замовлення без користувача!)

Коли використовувати кожен тип

SELF JOIN - таблиця з собою

SELF JOIN приклад

Співробітники та їх босси

-- Таблиця employees з manager_id посилання на себе
SELECT 
  e.name AS employee,
  m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

-- Результат:
-- employee | manager
-- Alice    | Bob
-- Bob      | Charlie
-- Charlie  | NULL (CEO)

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

Як отримати користувачів БЕЗ замовлень?

  • INNER JOIN
  • LEFT JOIN де orders.id IS NULL
  • RIGHT JOIN
✅ Правильна відповідь: LEFT JOIN де orders.id IS NULL
💡 Пояснення:

LEFT JOIN дає всі користувачи, потім WHERE IS NULL фільтрує без замовлень.

Помилка: плутанина RIGHT/LEFT

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

RIGHT часто замініують з LEFT по помилці

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

-- Хочемо всі користувачи з замовленнями (якщо є)
SELECT * FROM orders o
LEFT JOIN users u ON o.user_id = u.id;  -- НЕПРАВИЛЬНО!

Це дає всі замовлення (з лівої), не користувачів

✓ Правильно

SELECT * FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

users з лівої = всі користувачи

JOIN типи історія

Від простого до складного

1974

JOIN базова

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

1986

INNER JOIN

Явна синтаксис

1992

LEFT/RIGHT

Зовнішні JOIN

2025

LATERAL JOIN

Складні JOIN

Порівняння типів JOIN

Тип Результати NULL Приклад
INNER Спільні Ні Користувачи З замовленнями
LEFT Все з лівої Так (права) Користувачи ± замовлення
RIGHT Все з правої Так (ліва) Замовлення ± користувачи
SELF Таблиця до себе Залежить Ієрархія

Best practices JOIN типи

Міні ТЗ: знайти без замовлень

Комплексна анализа

Розраховуємо середні рядка

SELECT 
  u.name,
  COUNT(o.id) AS order_count,
  AVG(o.amount) AS avg_order
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id
HAVING COUNT(o.id) > 0
ORDER BY order_count DESC;

Підсумки

  • INNER: спільні, LEFT: все з лівої, RIGHT: все з правої
  • SELF: таблиця з собою для ієрархій
  • LEFT найпопулярніший у аналітиці

Далі — MLOps та інтеграція ML з БД

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

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

Лекція 17: MLOps & Databases

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

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

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

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