В базе данных редко бывает всё в одной таблице. Чаще всего информация разбита: в одной — клиенты, в другой — заказы, в третьей — оплаты. Каждая таблица по отдельности логична, но когда нужно, например, сделать отчёт или ответить на вопрос «кто купил больше всех, но оплатил не сразу», — приходится доставать данные из разных таблиц и собирать их вместе.
Объединить таблицы в SQL — значит не слить их в одну, как в Excel, а временно связать между собой, чтобы получить нужную информацию. Это делается с помощью SQL-запроса. Особенно удобно отлаживать такие запросы на VPS, где установлен сервер баз данных и есть доступ к реальной рабочей структуре. Сами таблицы при этом не меняются — просто создаётся результат, как если бы вы собрали всё в один список на экране.
SQL предлагает два способа:
- JOIN — объединяет строки по общему признаку (например, по ID);
- UNION — просто складывает списки друг под другом, если структура одинаковая.
Разберём оба метода — что они делают, как применяются и когда что выбрать.
Когда использовать JOIN: собираем данные по признаку
JOIN соединяет связанные данные из разных таблиц. Например:
- в одной — сотрудники, их имена и внутренние ID,
- во второй — информация об отпусках: кто, когда уходил и на сколько.
Каждая из таблиц по отдельности не даёт полной картины. Допустим, в таблице vacations есть строка:
employee_id = 3, отпуск с 10 по 20 июня
Но кто такой сотрудник с ID 3? Чтобы узнать его имя, нужна таблица employees, где этот ID сопоставлен с именем.
Здесь и пригодится JOIN: он связывает две таблицы по общему признаку — в этом случае по ID.
Пример использования JOIN на практике
Предположим, у вас есть база данных, например в MySQL, PostgreSQL или другой СУБД. Подключиться к ней можно через:
- встроенную панель администратора (phpMyAdmin),
- CRM-интерфейс с поддержкой SQL-запросов,
- программу вроде DBeaver, DataGrip или HeidiSQL.
В окне SQL-запросов вводите:
SELECT employees.name, vacations.start_date, vacations.end_date
FROM employees
JOIN vacations ON employees.id = vacations.employee_id
SQL выбирает имя сотрудника из employees, берёт даты отпуска из vacations, соединяет строки по совпадению id и employee_id.
Результат:
Иванов | 2024-05-10 | 2024-05-20
Петров | 2024-06-01 | 2024-06-05
Если у сотрудника нет отпуска — он не появится в этом списке. Так работает INNER JOIN: он показывает только совпадающие строки.
JOIN незаменим при составлении отчёта: кто что купил, когда оплатил, на какую сумму. Например, если заказы хранятся в одной таблице, клиенты — в другой, а статусы оплат — в третьей. Всё это связывается по ID и только тогда получается цельная картина. JOIN позволяет связать разрозненные таблицы в связную структуру, необходимую для полноценного анализа.
Подробнее о функции JOIN читайте в нашем блоге.
Когда использовать UNION: объединяем строки из двух источников
Иногда данные хранятся в двух таблицах с одинаковой структурой. Например:
- vacations_main — основная таблица отпусков,
- vacations_archive — архив с прошлыми отпусками.
Чтобы собрать все строки из обеих таблиц в один список, используется оператор UNION ALL. Он складывает записи строка за строкой, не удаляя повторы:
SELECT employee_id, start_date, end_date FROM vacations_main
UNION ALL
SELECT employee_id, start_date, end_date FROM vacations_archive
Этот запрос сначала выбирает данные из основной таблицы (vacations_main). Затем добавляет к ним строки из архива (vacations_archive). Всё это объединяет в одну выборку, включая дубликаты. Если одинаковая запись встречается в обеих таблицах — она будет показана дважды.
Если хотите исключить повторяющиеся строки, можно использовать просто UNION (без ALL):
SELECT employee_id, start_date, end_date FROM vacations_main
UNION
SELECT employee_id, start_date, end_date FROM vacations_archive
Отличие: UNION автоматически удаляет дубликаты, сравнивая строки полностью по всем полям. Однако это может немного замедлить выполнение запроса, особенно при больших объёмах данных.
Практическая задача с UNION ALL: объединяем онлайн- и офлайн-заказы
Представим, что компания получает заказы из двух каналов:
- через сайт — таблица web_orders,
- через магазины — таблица retail_orders.
Обе таблицы имеют одинаковую структуру. Это три столбца:
- id — номер заказа,
- client_name — имя клиента,
- amount — сумма покупки.
Чтобы получить общий список всех заказов, независимо от канала, можно использовать UNION ALL:
SELECT id, client_name, amount FROM web_orders
UNION ALL
SELECT id, client_name, amount FROM retail_orders
SQL сначала берёт все заказы с сайта, затем добавляет к ним офлайн-заказы. Результат — полный список покупок из всех источников, строка за строкой. Если какая-то покупка по ошибке попала и туда, и туда — она отобразится дважды.
Чтобы исключить такие повторы, можно применить просто UNION:
SELECT id, client_name, amount FROM web_orders
UNION
SELECT id, client_name, amount FROM retail_orders
Важное правило: число столбцов должно совпадать.
UNION и UNION ALL работают только в том случае, если обе выборки возвращают одинаковое число столбцов с совместимыми типами данных. Иначе будет ошибка.
Пример неправильного запроса, где ошибка ― в первой выборке два столбца, во второй — три:
SELECT id, client_name FROM web_orders
UNION ALL
SELECT id, client_name, amount FROM retail_orders
Чтобы избежать таких проблем — убедитесь, что структура обеих таблиц совпадает, или явно укажите нужные поля.
Используйте UNION, когда нужно удалить повторы.
А UNION ALL, если важны все записи, даже дублирующиеся.
Оба варианта подойдут, когда данные поступают из нескольких источников с одинаковой структурой и вы хотите объединить их в единый список.
JOIN и UNION: в чём разница
JOIN нужен, чтобы собрать полную информацию из разных таблиц по какому-то совпадению (например, по ID).
UNION — когда таблицы одинаковые по структуре и их надо просто объединить таблицы в один результат запроса.
Примеры для запоминания:
- клиенты + заказы → JOIN;
- клиенты с сайта + клиенты из розницы → UNION;
- товары + остатки на складе → JOIN;
- таблицы отчётов по разным месяцам → UNION.
Частые ошибки
Использование UNION для таблиц с разной структурой. Если количество колонок не совпадает или типы данных разные — запрос не сработает.
Забыли ON в JOIN. Без условия SQL не поймёт, как именно соединять строки. Обязательно указывайте, по какому полю связываются таблицы.
Забыли про дубликаты в UNION. UNION по умолчанию убирает повторяющиеся строки. Если нужны все — используйте UNION ALL.
Заключение
Для сбора данных из нескольких таблиц в SQL — вы почти наверняка будете использовать либо JOIN, либо UNION. JOIN используется для объединения информации по ключу: когда данные разбиты между таблицами. UNION объединяет строки с одинаковой структурой из разных источников. Выбор метода зависит от задачи: связать — JOIN, сложить — UNION. И помните: объединения — это не «склейка таблиц», а способ получить осмысленный результат одним SQL-запросом, без копирования данных вручную.
Читайте в блоге:
- Как установить и настроить PostgreSQL на VPS с CentOS
- Оптимизация производительности MySQL на сервере CentOS
- Как восстановить базу данных MySQL