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

Ответ

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

Ключевые характеристики:

  1. Удаление дубликатов: По умолчанию UNION возвращает только уникальные строки.
  2. Совместимость столбцов: Все SELECT запросы должны иметь одинаковое количество столбцов, и соответствующие столбцы должны быть совместимых типов данных.
  3. Порядок: Столбцы объединяются по позиции, а не по имени.

Пример:

-- Найти всех поставщиков и клиентов из города 'London'
SELECT City, 'Supplier' AS Type FROM Suppliers WHERE City = 'London'
UNION
SELECT City, 'Customer' FROM Customers WHERE City = 'London';

Варианты и ограничения:

  • UNION ALL: Объединяет результаты без удаления дубликатов. Работает быстрее, если дубли не критичны.
  • ORDER BY: Может быть указан только в конце всего объединенного запроса и применяется к итоговому результату.
  • Ограничение: Нельзя использовать UNION внутри подзапроса с IN (в некоторых СУБД), но результат UNION можно использовать как подзапрос.

Ответ 18+ 🔞

Давай разжую эту тему про UNION, а то некоторые думают, что это профсоюз какой-то, ёпта.

Ну вот представь, у тебя есть два списка. Один — поставщики, другой — клиенты. И тебе, хитрой жопе, надо из обоих списков выцепить всех, кто из Лондона, и свалить их в одну кучу. Вот UNION — это как раз такой мусорный бак для запросов. Кидаешь в него результаты отборов, а он тебе один общий список выдает.

Что важно помнить, чтобы не обосраться:

  1. Дубликаты нахуй. Обычный UNION — чистюля. Он все одинаковые строки выкинет, оставит только уникальные. Если тебе похуй на дубли — юзай UNION ALL. Он быстрее, потому что не парится с проверками, просто слепляет всё в кучу.
  2. Столбцы в ряд. Это самое главное, блядь! Нельзя в первый SELECT три столбца запихнуть, а во второй — пять. Количество должно совпадать, как яйца у здорового мужика. И типы данных в этих столбцах должны быть хоть немного совместимы. Не будешь же текст с датой склеивать, верно? Скрещивать ужа с ежом — пиздец идея.
  3. Именование. Итоговые названия столбцов берутся из ПЕРВОГО запроса. Так что если во втором SELECT у тебя столбец ClientName называется, а в первом — SupplierName, то в результате все будут зваться как в первом. Подстрахуйся алиасами, чтоб потом не ебаться.

Вот смотри, как это выглядит вживую:

-- Ищем всех, кто торчит в Лондоне: и поставщиков, и клиентов
SELECT City, 'Supplier' AS Type FROM Suppliers WHERE City = 'London'
UNION
SELECT City, 'Customer' FROM Customers WHERE City = 'London';

Видишь? Первый запрос тащит поставщиков, второй — клиентов. Оба возвращают по два столбца: город и тип. UNION склеивает это в одну таблицу. И если какой-то ушлёпок будет и поставщиком, и клиентом одновременно, в обычном UNION он встретится только один раз.

Ещё пара важных фишек, чтобы не быть лохом:

  • ORDER BY можно применить только ко всему итоговому результату, в самом конце. Нельзя каждый SELECT по отдельности сортировать внутри UNION. Это как пытаться одновременно срать и писать — получится ерунда.
  • Ограничения, блядь. В некоторых базах данных (я смотрю на тебя, старый MySQL) нельзя воткнуть UNION прямо внутрь оператора IN. Типа WHERE id IN (SELECT ... UNION SELECT ...) — может и не прокатить. Но выход есть — заверни весь свой UNION в подзапрос, и тогда всё заведется: WHERE id IN ((SELECT ... UNION SELECT ...)). Двойные скобки — наше всё, ебать мои старые костыли!

Короче, UNION — инструмент простой, но мощный. Главное — следи за столбцами и помни про дубли. А там — хуй с горы, дело житейское.