Как объединить результаты двух SELECT-запросов в SQL?

«Как объединить результаты двух SELECT-запросов в SQL?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для объединения результатов двух или более SELECT-запросов в SQL используются операторы UNION и UNION ALL. Их основное отличие — в обработке дубликатов.

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

Пример использования:

-- Получить всех поставщиков из двух разных городов
SELECT supplier_id, supplier_name FROM suppliers WHERE city = 'Москва'
UNION ALL
SELECT supplier_id, supplier_name FROM suppliers WHERE city = 'Санкт-Петербург';

Критически важные условия для объединения:

  1. Количество столбцов в каждом SELECT должно быть одинаковым.
  2. Соответствующие столбцы должны иметь совместимые типы данных (например, VARCHAR и TEXT, INT и BIGINT).
  3. Столбцы выбираются в одном и том же порядке.

Сортировка объединенного результата: ORDER BY применяется только один раз в конце всего запроса.

SELECT product_name FROM current_products
UNION
SELECT product_name FROM archived_products
ORDER BY product_name; -- Сортирует финальный объединенный набор

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

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