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 — локальная установка не требуется.
Все уроки этого курса
- UNION и UNION ALL
- Совместимость количества и типов столбцов
- INTERSECT и EXCEPT для сравнения
- Имитация операций над множествами с помощью JOIN