Основи баз даних
VTFK • 2025
Лекція 15: JOIN логіка
Фокус: 4 основні типи та їх практика
Повертає тільки рядки де умова ON істинна у обох таблицях.
Аналогія: Перетин множин: результат = що є в обох
Спільна частина
Тільки користувачі з замовленнями
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
-- (користувачі без замовлень виключені)
Повертає все з лівої таблиці + спільні рядки з правої. NULL для неспівпадаючих.
Аналогія: Всі з лівої щоб які порівні, з NULL замість даних правої
Все з лівої + спільне
Усі користувачи з замовленнями (якщо є)
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 (без замовлень)
-- (всі користувачи включені)
Повертає все з правої таблиці + спільні рядки з лівої. NULL для неспівпадаючих.
Аналогія: Протилежність LEFT: все з правої, NULL з лівої
Усі замовлення з користувачами (якщо потрібні)
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 (замовлення без користувача!)
Співробітники та їх босси
-- Таблиця 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)
LEFT JOIN дає всі користувачи, потім WHERE IS NULL фільтрує без замовлень.
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
Складні JOIN
| Тип | Результати | NULL | Приклад |
|---|---|---|---|
| INNER | Спільні | Ні | Користувачи З замовленнями |
| LEFT | Все з лівої | Так (права) | Користувачи ± замовлення |
| RIGHT | Все з правої | Так (ліва) | Замовлення ± користувачи |
| SELF | Таблиця до себе | Залежить | Ієрархія |
Розраховуємо середні рядка
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;
Далі — MLOps та інтеграція ML з БД
Лекція 17: MLOps & Databases
Дякую за увагу! 💾