Как объединить данные из двух таблиц в SQL
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Объединение данных из двух таблиц в SQL
Объединение (JOIN) — одна из самых важных операций в SQL. Существует несколько типов объединений, каждый решает разные задачи.
Структура данных для примеров
-- Таблица пользователей
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
-- Таблица заказов
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
product VARCHAR(100),
amount DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- Данные
INSERT INTO users VALUES
(1, "Alice", "alice@example.com"),
(2, "Bob", "bob@example.com"),
(3, "Charlie", "charlie@example.com");
INSERT INTO orders VALUES
(1, 1, "Laptop", 999.99),
(2, 2, "Mouse", 29.99),
(3, 1, "Keyboard", 79.99);
1. INNER JOIN (Внутреннее объединение)
Возвращает только строки, где есть совпадения в обеих таблицах.
SELECT users.id, users.name, orders.product, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
Результат:
id | name | product | amount
1 | Alice | Laptop | 999.99
2 | Bob | Mouse | 29.99
1 | Alice | Keyboard | 79.99
Альтернативный синтаксис
-- Эквивалентно INNER JOIN
SELECT users.id, users.name, orders.product
FROM users, orders
WHERE users.id = orders.user_id;
2. LEFT JOIN (Левое внешнее объединение)
Возвращает все строки из левой таблицы и совпадающие из правой. Если совпадений нет — NULL.
SELECT users.id, users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
Результат:
id | name | product
1 | Alice | Laptop
1 | Alice | Keyboard
2 | Bob | Mouse
3 | Charlie | NULL
Charlie не имеет заказов, но включён в результат с NULL значением.
3. RIGHT JOIN (Правое внешнее объединение)
Возвращает все строки из правой таблицы и совпадающие из левой.
SELECT users.id, users.name, orders.product
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
Результат:
id | name | product
1 | Alice | Laptop
2 | Bob | Mouse
1 | Alice | Keyboard
4. FULL OUTER JOIN (Полное внешнее объединение)
Возвращает все строки из обеих таблиц. Если совпадений нет — NULL.
SELECT users.id, users.name, orders.id as order_id, orders.product
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;
Результат:
id | name | order_id | product
1 | Alice | 1 | Laptop
1 | Alice | 3 | Keyboard
2 | Bob | 2 | Mouse
3 | Charlie | NULL | NULL
5. CROSS JOIN (Декартово произведение)
Объединяет каждую строку первой таблицы с каждой строкой второй.
SELECT users.name, orders.product
FROM users
CROSS JOIN orders;
Результат:
name | product
Alice | Laptop
Alice | Mouse
Alice | Keyboard
Bob | Laptop
Bob | Mouse
Bob | Keyboard
Charlie | Laptop
Charlie | Mouse
Charlie | Keyboard
9 строк (3 пользователя × 3 заказа).
6. SELF JOIN (Самообъединение)
Объединение таблицы с самой собой для сравнения данных.
-- Найти сотрудников, зарплата которых выше средней
CREATE TABLE employees (
id INT,
name VARCHAR(100),
salary DECIMAL(10, 2),
manager_id INT
);
-- Найти менеджера каждого сотрудника
SELECT e.name as employee, m.name as manager
FROM employees e
INNER JOIN employees m ON e.manager_id = m.id;
Практические примеры
Пример 1: Получить список пользователей с количеством их заказов
SELECT users.id, users.name, COUNT(orders.id) as order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id, users.name;
Результат:
id | name | order_count
1 | Alice | 2
2 | Bob | 1
3 | Charlie | 0
Пример 2: Получить средний размер заказа по пользователям
SELECT users.name, AVG(orders.amount) as avg_amount
FROM users
INNER JOIN orders ON users.id = orders.user_id
GROUP BY users.id, users.name;
Пример 3: Объединение трёх таблиц
-- Добавим таблицу категорий
CREATE TABLE categories (
id INT PRIMARY KEY,
product_name VARCHAR(100),
category VARCHAR(50)
);
-- Объединяем три таблицы
SELECT users.name, orders.product, categories.category
FROM users
INNER JOIN orders ON users.id = orders.user_id
INNER JOIN categories ON orders.product = categories.product_name;
Сравнение типов JOIN
| JOIN | Описание | Результат |
|---|---|---|
| INNER | Только совпадения | 3 строки |
| LEFT | Все из левой, совпадающие из правой | 4 строки |
| RIGHT | Все из правой, совпадающие из левой | 3 строки |
| FULL OUTER | Все из обеих таблиц | 4 строки |
| CROSS | Декартово произведение | 9 строк |
Оптимизация производительности
-- ✓ Хорошо: используются индексы
SELECT u.name, o.product
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE u.id = 1;
-- ✗ Плохо: без фильтра на ключе
SELECT u.name, o.product
FROM users u
INNER JOIN orders o ON u.name = o.product;
Рекомендации
- Используйте PRIMARY KEY и FOREIGN KEY для правильных объединений
- Индексируйте столбцы использующиеся в ON условиях
- Предпочитайте INNER JOIN когда возможно (быстрее)
- Избегайте больших CROSS JOIN — экспоненциальный рост результатов
- Используйте alias для улучшения читаемости
- Проверяйте условие ON — неправильное объединение даст некорректные результаты
Вывод
Объединение таблиц — основополагающий навык SQL. Выбор правильного типа JOIN критичен для получения корректных результатов и оптимальной производительности запроса.