← Назад к вопросам

Как объединить данные из двух таблиц в SQL

1.2 Junior🔥 251 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Объединение данных из двух таблиц в 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;

Рекомендации

  1. Используйте PRIMARY KEY и FOREIGN KEY для правильных объединений
  2. Индексируйте столбцы использующиеся в ON условиях
  3. Предпочитайте INNER JOIN когда возможно (быстрее)
  4. Избегайте больших CROSS JOIN — экспоненциальный рост результатов
  5. Используйте alias для улучшения читаемости
  6. Проверяйте условие ON — неправильное объединение даст некорректные результаты

Вывод

Объединение таблиц — основополагающий навык SQL. Выбор правильного типа JOIN критичен для получения корректных результатов и оптимальной производительности запроса.

Как объединить данные из двух таблиц в SQL | PrepBro