Что делает оператор UNION в SQL и каковы его основные правила?

Ответ

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

Основные правила и особенности:

  1. Количество и тип столбцов: Все SELECT в объединении должны иметь одинаковое количество столбцов, и соответствующие столбцы должны иметь совместимые типы данных.
  2. Устранение дубликатов: По умолчанию UNION удаляет повторяющиеся строки из конечного результата. Для сохранения всех строк, включая дубликаты, используется UNION ALL.
  3. Порядок и имена столбцов: Имена столбцов в результирующем наборе берутся из первого SELECT. Порядок строк определяется порядком выполнения запросов и последующей сортировкой (если не используется ORDER BY).

Синтаксис:

SELECT column1, column2 FROM table1
UNION -- или UNION ALL
SELECT column1, column2 FROM table2
ORDER BY column1; -- ORDER BY применяется ко всему объединенному результату

Пример:

-- Найти всех поставщиков и клиентов из города 'London'
SELECT 'Supplier' AS Type, company_name, city FROM suppliers WHERE city = 'London'
UNION
SELECT 'Customer', company_name, city FROM customers WHERE city = 'London'
ORDER BY company_name;

Сравнение UNION и UNION ALL:

  • UNION: Выполняет дополнительную операцию сортировки/хеширования для удаления дубликатов. Медленнее, но гарантирует уникальность.
  • UNION ALL: Просто склеивает результаты. Быстрее. Используйте его, если дубликаты невозможны или не критичны.

Ответ 18+ 🔞

Давай разберем эту штуку, которая всех так путает — оператор UNION. Представь, что у тебя есть два списка: один с поставщиками, другой с клиентами. И тебе нужно их склеить в один большой список, чтобы всех разом посмотреть. Вот UNION — это как скотч для SQL-запросов, только умный.

Суть простая, но есть нюансы, блядь:

  1. Колонки должны совпадать, как близнецы-уроды. Если в первом запросе три колонки, то и во втором — ровно три. И типы данных должны быть совместимы, а то получишь ошибку вместо результата. Нельзя текст с цифрой слепить, ёпта.
  2. Он по умолчанию — чистюля. UNION сам выкидывает все абсолютно одинаковые строки, оставляя только уникальные. Если тебе нужны ВСЕ записи, даже повторяющиеся, то юзай UNION ALL. Это как разница между "убраться в комнате" и "сгрести всё в кучу в углу" — второй способ всегда быстрее.
  3. Имена колонок берёт у первого парня на деревне. То есть у первого SELECT. А порядок строк может быть какой попало, если в конце не прикрутить ORDER BY.

Выглядит это дело так:

SELECT имя, город FROM поставщики
UNION ALL -- Быстро, дубли не удаляет!
SELECT имя, город FROM клиенты
ORDER BY город; -- Сортируем уже общую солянку

Пример из жизни, чтобы въехать: Допустим, начальник орёт: "Давай мне всех, блядь, кто связан с нами из Лондона! И поставщиков, и клиентов! В одну таблицу!"

SELECT 'Поставщик' AS Кто_такой, компания, город FROM suppliers WHERE город = 'London'
UNION
SELECT 'Клиент', компания, город FROM customers WHERE город = 'London'
ORDER BY компания;

Вот и всё. Первый запрос говорит "я поставщик", второй — "я клиент". UNION их сливает, убирая полных тезок (если такие вдруг найдутся), а ORDER BY всех по алфавиту строит.

Главная дилемма: UNION vs UNION ALL

  • UNION: Умный, но тормозной. Перед тем как выдать результат, он проводит ревизию и выкидывает дубликаты. Тратит на это время. Используй, когда повторения — это мусор.
  • UNION ALL: Простой и шустрый пацан. Берёт и тупо приклеивает результаты второго запроса к хвосту первого. В 99% случаев, если ты уверен, что дублей нет или они не страшны, надо юзать именно UNION ALL. Экономия производительности — овердохуищная!

Короче, если нужно слепить — UNION. Если нужно слепить быстро и похуй на дубли — UNION ALL. Запомни это, и половина проблем отпадёт, ядрёна вошь!