Как объединить таблицы в SQL для отчётов и анализа: методы JOIN и UNION

Как объединить таблицы в SQL для отчётов и анализа: методы JOIN и UNION

В базе данных редко бывает всё в одной таблице. Чаще всего информация разбита: в одной — клиенты, в другой — заказы, в третьей — оплаты. Каждая таблица по отдельности логична, но когда нужно, например, сделать отчёт или ответить на вопрос «кто купил больше всех, но оплатил не сразу», — приходится доставать данные из разных таблиц и собирать их вместе.

Объединить таблицы в SQL — значит не слить их в одну, как в Excel, а временно связать между собой, чтобы получить нужную информацию. Это делается с помощью SQL-запроса. Особенно удобно отлаживать такие запросы на VPS, где установлен сервер баз данных и есть доступ к реальной рабочей структуре. Сами таблицы при этом не меняются — просто создаётся результат, как если бы вы собрали всё в один список на экране.

Аренда VPS/VDS от 219 руб/месяц

Преимущества VPS в AdminVPS:

✓ Бесплатное администрирование

✓ Только быстрые NVMe-диски

✓ Защита от DDoS-атак

✓ Быстрая техподдержка

Аренда VPS/VDS виртуального сервера от AdminVPS — это прозрачная и честная услуга с доступной ценой

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-запросом, без копирования данных вручную.

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

VPN на VPS-сервере

Узнайте, как создать собственный VPN на VPS-сервере для защиты ваших конфиденциальных данных!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях