Основи баз даних
VTFK • 2025
Лекція 14: ORDER BY
Фокус: об'єднання даних з кількох таблиць
Поєднання рядків з двох або більш таблиць за спільним умовам (зазвичай FK/PK).
Аналогія: Як скріпити два документи разом по номеру посилання
Як поєднуються таблиці
SELECT columns
FROM table1
JOIN table2 ON table1.id = table2.table1_id;
| Тип | Завдання |
|---|---|
| INNER JOIN | Тільки спільні рядки |
| LEFT JOIN | Все з лівої + спільні |
| RIGHT JOIN | Все з правої + спільні |
| FULL OUTER JOIN | Все з обох |
| CROSS 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
Коротко та читабельно
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 дає перетин: рядки які існують в обох таблицях.
Без 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 вказує спільну колонку для об'єднання
Один користувач, багато замовлень
Від реляційної логіки
Перша реалізація
LEFT/RIGHT JOIN стандартизація
Додано FULL OUTER 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
Лекція 16: Типи JOIN
Дякую за увагу! 💾