Ответ
Оператор UNION в SQL используется для объединения результатов двух или более SELECT-запросов в один результирующий набор. Ключевые особенности:
- Объединяет только совместимые наборы данных: Все
SELECT-запросы должны возвращать одинаковое количество столбцов, и соответствующие столбцы должны иметь совместимые типы данных. - Удаляет дубликаты строк: По умолчанию
UNIONвозвращает только уникальные строки из объединенного результата (аналогичноSELECT DISTINCT). UNION ALL: Если нужно сохранить все строки, включая дубликаты, используетсяUNION ALL. Он работает быстрее, так как не выполняет проверку на уникальность.
Синтаксис:
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2
ORDER BY column1; -- Сортировка применяется к конечному результату
Практический пример:
Предположим, есть две таблицы: employees_uk и employees_usa. Нужно получить общий список уникальных email всех сотрудников.
-- Получить уникальные email из двух таблиц
SELECT email FROM employees_uk
UNION
SELECT email FROM employees_usa
ORDER BY email;
-- Получить ВСЕ email, включая повторяющиеся
SELECT email FROM employees_uk
UNION ALL
SELECT email FROM employees_usa;
Важные отличия от JOIN:
JOINсоединяет таблицы по горизонтали (добавляет столбцы), основываясь на условии связи.UNIONобъединяет результаты по вертикали (добавляет строки), требуя одинаковую структуру выборок.
Применение в тестировании:
- Проверка корректности данных после миграции или сравнения данных из разных источников.
- Создание комплексных тестовых наборов данных.
Ответ 18+ 🔞
Давай разберём эту штуку, про которую все так умно говорят, а на деле — обычный склейщик бумажек, только в базе данных. UNION, блядь.
Представь, у тебя есть два списка имён: один от тёщи, другой от начальника. И тебе надо их слить в один, но так, чтобы Петров Иван не повторялся, а то он и там мудак, и тут мудак. Вот UNION это и делает — берёт результаты от нескольких SELECT-запросов и склеивает их в одну кучу, по вертикали, сука.
Но есть нюансы, ёпта:
- Совместимость — это всё. Нельзя, блядь, склеить столбец с именами и столбец с датами так, чтобы получилось что-то вменяемое. Все
SELECT-ы должны возвращать одинаковое число столбцов, и типы данных должны хотя бы не конфликтовать. Иначе получишь ошибку, и будешь сидеть, чесать репу. - Дубликаты — нахуй. По умолчанию
UNIONведёт себя как зануда-перфекционист и выкидывает все повторяющиеся строки. Работает какSELECT DISTINCTдля объединённого результата. UNION ALL— быстрее и проще. А если тебе похуй на дубликаты, или ты их специально хочешь сохранить (например, для подсчёта), то юзайUNION ALL. Он тупо сваливает всё в одну кучу без проверок, поэтому и работает шустрее, как паровоз.
Как это выглядит в коде, не трогаем его, он святой:
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2
ORDER BY column1; -- Сортируем уже финальный результат, блядь
Пример из жизни, чтобы не быть голословным:
Допустим, у тебя офисы в Лондоне (employees_uk) и в Штатах (employees_usa). Надо собрать всех уникальных почтарей, чтобы спам рассылать.
-- Собираем УНИКАЛЬНЫЕ почты со всех концов света
SELECT email FROM employees_uk
UNION
SELECT email FROM employees_usa
ORDER BY email; -- И чтоб красиво, по алфавиту, сука
-- А вот если нам надо ВСЕ почты, даже если Васян дублируется (он и там, и тут работает)
SELECT email FROM employees_uk
UNION ALL
SELECT email FROM employees_usa;
И главное, не путай с JOIN, а то будет пиздец.
JOIN— это как брак, блядь. Он соединяет две таблицы горизонтально, по какому-то общему признаку (ключу), и получается одна широкая запись. "Ты — моя половинка, вот твои данные и мои, вместе".UNION— это как очередь, сука. Он ставит результаты одного запроса под результаты другого, вертикально. "Отсюда список, оттуда список, всё в одну колонку, и не толкаться".
Где пригодится, кроме как спам рассылать? Ну, например, проверить, не накосячил ли ты при переносе данных с одной базы на другую. Или собрать тестовый датасет из кусочков разных таблиц, чтобы потом на нём всё сломать. В общем, штука полезная, если знать, куда её приложить, а не просто так, для красоты.