0Pricing
SQL Interview Prep · Урок

UNION и UNION ALL

Различия в удалении дубликатов и производительности и причина, по которой обычно нужен UNION ALL.

«UNION и UNION ALL» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Interview Prep содержит 4 уроков всего.

Почему на собеседованиях спрашивают о UNION

Операции над множествами объединяют один набор результатов с другим, располагая строки вертикально. UNION и UNION ALL — первые операции над множествами, о которых спрашивают на собеседованиях, потому что разница между ними формулируется одной строкой и показывает, понимаете ли Вы затраты.

Вопрос почти всегда звучит так: «В чём разница между UNION и UNION ALL и какой вариант следует использовать?» Сильный ответ сразу упоминает удаление дубликатов, сортировку и производительность.

Что делает UNION

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

Чтобы удалить дубликаты, системе приходится сортировать или хешировать все объединённые строки, а это требует реальных ресурсов. UNION возвращает множество в математическом смысле: без повторов.

SELECT city FROM customers
UNION
SELECT city FROM suppliers;

Что делает UNION ALL

UNION ALL соединяет два набора результатов и сохраняет каждую строку, включая дубликаты. Дубликаты не удаляются, поэтому для этой цели не выполняются ни сортировка, ни хеширование.

Поскольку этап удаления дубликатов пропускается, UNION ALL почти всегда работает быстрее и является правильным выбором, если Вы знаете, что строки не пересекаются, или если дубликаты нужны.

SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;

Разница в производительности

Главный вывод для собеседования: UNION ALL дешевле, потому что он никогда не удаляет дубликаты. UNION должен сравнить все объединённые строки между собой, чтобы убрать повторы.

  • UNION = UNION ALL + неявный шаг DISTINCT.
  • Для больших наборов результатов этот DISTINCT может составлять основную часть стоимости запроса.

Если удалять дубликаты не нужно, выбор UNION приводит к лишним затратам CPU и памяти.

Практический пример с дубликатами

Предположим, оба запроса могут вернуть строку 'Paris'. С UNION Вы получите одну строку Paris. С UNION ALL Вы получите Paris дважды.

На собеседованиях любят просить предсказать количество строк. Сначала всегда представляйте исходное объединение, а затем спрашивайте себя: удаляет ли оператор повторы?

-- customers.city: Paris, Lyon
-- suppliers.city: Paris, Nice
-- UNION     -> Paris, Lyon, Nice   (3 rows)
-- UNION ALL -> Paris, Lyon, Paris, Nice (4 rows)

Дубликаты определяются по всем столбцам

Распространённая ловушка: две строки являются дубликатами только тогда, когда каждый выбранный столбец в них равен. Добавьте один отличающийся столбец — и строки перестанут быть дубликатами, поэтому UNION сохранит их обе.

Поэтому SELECT id, city часто возвращает больше строк, чем SELECT city при использовании UNION, даже для одних и тех же таблиц.

SELECT id, city FROM customers
UNION
SELECT id, city FROM suppliers;
-- ids differ -> few or no duplicates removed

Сортировка объединённого результата

Нельзя указывать ORDER BY в отдельных ветвях запроса: он применяется ко всему объединённому результату и должен появиться один раз, в самом конце.

Интервьюер может спросить, где размещается ORDER BY. Ответ: один ORDER BY после последнего запроса, с обращением к выходным столбцам по имени или по позиции.

SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers
ORDER BY city;

Имена столбцов берутся из первого запроса

При обращении к столбцам в финальном ORDER BY используйте имена (или псевдонимы) из первого SELECT. Имена столбцов второго запроса не учитываются при формировании заголовков результата.

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

SELECT city AS location FROM customers
UNION ALL
SELECT town FROM suppliers
ORDER BY location;

Когда следует выбирать UNION

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

Если вы можете гарантировать, что источники не пересекаются, UNION ALL даст тот же результат быстрее.

SELECT email FROM web_signups
UNION
SELECT email FROM store_signups;
-- one row per distinct email across both

Когда следует выбирать UNION ALL

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

Совет для собеседований: скажите, что UNION ALL является вариантом по умолчанию и переходить к UNION следует только при действительной необходимости удалить дубликаты.

SELECT * FROM sales_2023
UNION ALL
SELECT * FROM sales_2024;

Объединяем всё

Отточенный ответ на собеседовании может звучать так: «UNION удаляет дублирующиеся строки, что требует сортировки или хеширования; UNION ALL сохраняет всё и работает быстрее. Оба варианта требуют одинакового количества столбцов и совместимых типов, а любой ORDER BY указывается один раз в конце. По умолчанию я выбираю UNION ALL, если только дедупликация не требуется».

Эта одна фраза одновременно показывает корректность и понимание производительности.

Быстрая проверка

Проверьте, насколько хорошо вы понимаете различие между UNION и UNION ALL.

Итоги

Основные выводы:

  • UNION = объединение + удаление дублирующихся строк (неявный DISTINCT, дополнительные затраты).
  • UNION ALL = объединение с сохранением всех строк, более высокая скорость, разумный вариант по умолчанию.
  • Чтобы строки считались дубликатами, должны совпадать все столбцы.
  • Единый ORDER BY указывается в самом конце и использует имена столбцов из первого запроса.

По умолчанию выбирайте UNION ALL; переходите к UNION только при действительно необходимом удалении дубликатов.

Часто задаваемые вопросы

Урок «UNION и UNION ALL» бесплатный?

Да — полный текст урока «UNION и UNION ALL» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «UNION и UNION ALL»?

Различия в удалении дубликатов и производительности и причина, по которой обычно нужен UNION ALL. Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Interview Prep?

Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «UNION и UNION ALL»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Interview Prep?

Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. UNION и UNION ALL
  2. Совместимость количества и типов столбцов
  3. INTERSECT и EXCEPT для сравнения
  4. Имитация операций над множествами с помощью JOIN
← Назад к SQL Interview Prep