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

Какие знаешь ситуации кроме дубликата?

1.0 Junior🔥 231 комментариев
#Работа с дефектами#Теория тестирования#Тестовая документация

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Типичные ситуации для использования оператора UNION в SQL (кроме удаления дубликатов)

Оператор UNION в SQL, помимо своей основной функции удаления дубликатов из результирующего набора данных (по умолчанию UNION DISTINCT), используется в нескольких других важных сценариях. Вот ключевые ситуации:

1. UNION ALL — объединение без удаления дубликатов

Часто нужно просто слить результаты нескольких запросов, сохранив все строки, включая потенциально повторяющиеся. Для этого используется модификатор ALL.

-- Пример: сбор логов из двух таблиц за один день
SELECT user_id, action, created_at FROM login_logs WHERE DATE(created_at) = '2023-10-01'
UNION ALL
SELECT user_id, action, created_at FROM activity_logs WHERE DATE(created_at) = '2023-10-01';
  • Преимущество: UNION ALL работает значительно быстрее, так как не требует дополнительных вычислений на сравнение и удаление дубликатов. Его всегда стоит использовать, если дубликаты невозможны или не критичны.

2. Объединение данных из разных таблиц со схожей структурой

Классический случай — консолидация данных, разнесенных по разным таблицам (например, по историческим периодам, по филиалам или по типам сущностей).

-- Пример: получение списка всех сотрудников из офисов в разных городах
SELECT id, name, 'Moscow' AS office FROM employees_moscow
UNION
SELECT id, name, 'St. Petersburg' AS office FROM employees_spb;

3. Разделение данных по условиям из одного источника для последующего объединения

Полезно, когда нужно применить разные агрегирующие функции или условия к одной таблице и затем получить единый отчет.

-- Пример: сводка по пользователям: активные и новые за период
SELECT 'Active Users' AS metric, COUNT(DISTINCT user_id) AS count
FROM sessions
WHERE last_activity_date >= CURRENT_DATE - INTERVAL '30 days'
UNION
SELECT 'New Registrations', COUNT(*)
FROM users
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days';

4. Создание "заглушек" или тестовых данных

UNION удобен для добавления стандартных строк (например, строки "Итого" или "Все категории") в результат запроса.

-- Пример: добавление строки "Всего" в отчет по категориям
SELECT category, SUM(price) AS total_sales FROM sales GROUP BY category
UNION
SELECT 'ИТОГО', SUM(price) FROM sales
ORDER BY total_sales DESC;

5. Эмуляция операции FULL OUTER JOIN в СУБД, где она не поддерживается

Некоторые базы данных (например, старые версии MySQL) не поддерживают FULL OUTER JOIN. Его можно заменить комбинацией LEFT JOIN, RIGHT JOIN и UNION.

-- Пример: эмуляция FULL OUTER JOIN для таблиц A и B
SELECT A.id, A.value, B.value
FROM table_A A
LEFT JOIN table_B B ON A.id = B.id
UNION
SELECT B.id, A.value, B.value
FROM table_A A
RIGHT JOIN table_B B ON A.id = B.id
WHERE A.id IS NULL;

6. Построение сложных условий отбора (альтернатива OR в многотабличных запросах)

Когда условия WHERE становятся слишком сложными из-за OR, которые обращаются к разным таблицам, запрос может потерять в производительности. Разделение на отдельные SELECT с последующим UNION часто оптимизируется планировщиком лучше.

-- Неэффективно с OR:
SELECT * FROM orders
WHERE customer_id = 100 OR EXISTS (SELECT 1 FROM referrals WHERE referrals.order_id = orders.id);

-- Более эффективная альтернатива с UNION:
SELECT * FROM orders WHERE customer_id = 100
UNION
SELECT o.* FROM orders o INNER JOIN referrals r ON r.order_id = o.id;

7. Сравнение и поиск расхождений в данных

Комбинируя UNION с агрегацией, можно находить различия между наборами данных.

-- Пример: поиск ID, которые есть только в одной из двух таблиц
SELECT id, 'Only in Table_A' AS remark FROM table_A
WHERE id NOT IN (SELECT id FROM table_B)
UNION
SELECT id, 'Only in Table_B' FROM table_B
WHERE id NOT IN (SELECT id FROM table_A);

Важные технические ограничения и требования:

  • Количество и порядок столбцов во всех объединяемых SELECT должны совпадать.
  • Типы данных соответствующих столбцов должны быть совместимы (СУБД попытается выполнить неявное приведение).
  • Работа с UNION (без ALL) может быть ресурсоемкой на больших объемах данных из-за необходимости сортировки и дедупликации.

Таким образом, UNION — это мощный инструмент не только для простого сложения множеств, но и для решения задач консолидации, формирования комплексных отчетов и оптимизации запросов. Понимание разницы между UNION и UNION ALL и грамотное их применение — ключевой навык для написания эффективного SQL-кода.