Ответ
UNION — это оператор SQL, который объединяет результаты двух или более SELECT-запросов в один набор данных.
Ключевые характеристики:
- Удаление дубликатов: По умолчанию
UNIONвозвращает только уникальные строки. - Совместимость столбцов: Все
SELECTзапросы должны иметь одинаковое количество столбцов, и соответствующие столбцы должны быть совместимых типов данных. - Порядок: Столбцы объединяются по позиции, а не по имени.
Пример:
-- Найти всех поставщиков и клиентов из города '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 — это как раз такой мусорный бак для запросов. Кидаешь в него результаты отборов, а он тебе один общий список выдает.
Что важно помнить, чтобы не обосраться:
- Дубликаты нахуй. Обычный
UNION— чистюля. Он все одинаковые строки выкинет, оставит только уникальные. Если тебе похуй на дубли — юзайUNION ALL. Он быстрее, потому что не парится с проверками, просто слепляет всё в кучу. - Столбцы в ряд. Это самое главное, блядь! Нельзя в первый
SELECTтри столбца запихнуть, а во второй — пять. Количество должно совпадать, как яйца у здорового мужика. И типы данных в этих столбцах должны быть хоть немного совместимы. Не будешь же текст с датой склеивать, верно? Скрещивать ужа с ежом — пиздец идея. - Именование. Итоговые названия столбцов берутся из ПЕРВОГО запроса. Так что если во втором
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 — инструмент простой, но мощный. Главное — следи за столбцами и помни про дубли. А там — хуй с горы, дело житейское.