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

Чем отличается UNION от UNION ALL в SQL?

2.0 Middle🔥 204 комментариев
#Базы данных и SQL

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

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

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

Разница между UNION и UNION ALL в SQL

UNION и UNION ALL — это два ключевых оператора SQL, используемых для объединения результатов нескольких запросов SELECT в единый результирующий набор. Хотя оба служат одной цели, их принципиальное отличие заключается в обработке дубликатов и, как следствие, в производительности.

Основное отличие: обработка дубликатов

  • UNION выполняет операцию объединения, а затем автоматически удаляет все дублирующиеся строки из окончательного результата. Это аналог математического объединения множеств.
  • UNION ALL просто объединяет все строки из всех запросов, включая абсолютно идентичные. Дубликаты сохраняются.

Производительность

Разница в логике напрямую влияет на скорость выполнения:

  • UNION ALL всегда быстрее, так как СУБД не выполняет дополнительную ресурсоемкую операцию по поиску и удалению дубликатов. Она просто "склеивает" результаты.
  • UNION требует сортировки или хеширования данных для сравнения строк и устранения повторов, что создает дополнительную нагрузку на CPU и память, особенно на больших объемах данных.

Пример на практике

Рассмотрим две простые таблицы:

-- Таблица "employees_floor_1"
CREATE TABLE employees_floor_1 (
    id INT,
    name VARCHAR(50)
);
INSERT INTO employees_floor_1 VALUES (1, 'Анна'), (2, 'Борис'), (3, 'Виктор');

-- Таблица "employees_floor_2"
CREATE TABLE employees_floor_2 (
    id INT,
    name VARCHAR(50)
);
INSERT INTO employees_floor_2 VALUES (3, 'Виктор'), (4, 'Галина'), (5, 'Дмитрий');

Пример с UNION ALL (дубликат "Виктор" остался):

SELECT id, name FROM employees_floor_1
UNION ALL
SELECT id, name FROM employees_floor_2
ORDER BY id;

Результат:

id | name
-----------
1  | Анна
2  | Борис
3  | Виктор  <-- из первой таблицы
3  | Виктор  <-- из второй таблицы (дубликат сохранен)
4  | Галина
5  | Дмитрий

Всего строк: 6.

Пример с UNION (дубликат "Виктор" удален):

SELECT id, name FROM employees_floor_1
UNION
SELECT id, name FROM employees_floor_2
ORDER BY id;

Результат:

id | name
-----------
1  | Анна
2  | Борис
3  | Виктор  <-- дубликат удален
4  | Галина
5  | Дмитрий

Всего строк: 5.

Правила использования и требования

Оба оператора предъявляют одинаковые требования к объединяемым запросам:

  • Количество столбцов в каждом SELECT должно совпадать.
  • Типы данных в соответствующих столбцах должны быть совместимы (или приводимы).
  • Столбцы выбираются в одинаковом порядке.

Ключевые выводы для QA Engineer

  1. Выбор оператора — это компромисс между семантикой и производительностью. Если по бизнес-логике дубликаты невозможны или недопустимы (например, объединение уникальных ID), используйте UNION. Если дубликаты допустимы или их необходимость проверяется в другом месте, всегда предпочитайте UNION ALL для скорости.
  2. Тестирование производительности. При тестировании сложных отчетов или дашбордов, использующих объединения, замена UNION на UNION ALL (где это уместно) может быть одним из методов оптимизации медленных запросов.
  3. Валидация данных. При тестировании ETL-процессов или интеграций важно понимать, какой оператор используется. UNION ALL может маскировать проблему дублирующейся записи в источнике данных, в то время как UNION "скроет" ее. Это может привести к невыявленным дефектам.
  4. Проверка требований. Всегда уточняйте у аналитика или разработчика, требуется ли в конкретном сценарии удаление дубликатов. Неверный выбор оператора — частая причина логических ошибок.

Резюме: UNION = объединение с уникальностью (дороже), UNION ALL = простая конкатенация (быстрее). Понимание этой разницы критически важно для эффективного тестирования SQL-запросов, анализа их планов выполнения и обеспечения корректности данных.

Чем отличается UNION от UNION ALL в SQL? | PrepBro