В чем разница между UNION и UNION ALL в SQL и приведи пример с дубликатами?

«В чем разница между UNION и UNION ALL в SQL и приведи пример с дубликатами?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое отличие: UNION удаляет дублирующиеся строки из конечного результата, а UNION ALL — нет. UNION ALL работает быстрее, так как не требует дополнительной операции сортировки и дедупликации.

Синтаксис:

SELECT column1, column2 FROM table1
UNION -- или UNION ALL
SELECT column1, column2 FROM table2;

Наглядный пример с дубликатами: Допустим, у нас есть таблица employees:

id name department
1 Alice Engineering
2 Bob Marketing
3 Alice Engineering
-- UNION: удалит дубликаты
SELECT name, department FROM employees WHERE id IN (1, 3)
UNION
SELECT name, department FROM employees WHERE id IN (2, 3);
-- Результат (2 строки):
-- | Alice | Engineering |
-- | Bob   | Marketing   |
-- Строка (Alice, Engineering) встретилась дважды в исходных выборках,
-- но в результат вошла только один раз.

-- UNION ALL: сохранит все строки, включая дубликаты
SELECT name, department FROM employees WHERE id IN (1, 3)
UNION ALL
SELECT name, department FROM employees WHERE id IN (2, 3);
-- Результат (4 строки):
-- | Alice | Engineering |
-- | Alice | Engineering | <- Дубликат
-- | Bob   | Marketing   |
-- | Alice | Engineering | <- Дубликат

Когда использовать:

  • Используйте UNION ALL, если вам нужна максимальная производительность и дубликаты допустимы или их не может быть по логике запроса.
  • Используйте UNION, когда необходимо гарантированно получить уникальный набор строк, а удаление дубликатов является требованием бизнес-логики.