UNION в SQL

Оператор UNION используется для объединения результатов двух или более запросов SELECT в один набор результатов. Команда UNION отличается от JOIN-операторов, которые объединяют столбцы из двух таблиц. UNION создает новую таблицу, помещая все строки из двух исходных таблиц в таблицу результатов и располагая эти строки друг над другом.

Далее приведены основные правила объединения наборов результатов двух запросов SELECT с помощью UNION:

  • Количество и порядок столбцов должны быть одинаковыми во всех запросах.
  • Типы данных соответствующих столбцов должны быть совместимы.

Если эти критерии выполняются, то таблицы совместимы с оператором UNION.

Синтаксис

Базовый синтаксис оператора UNION представлен следующим образом:

SELECT список_столбцов FROM таблица1
UNION SELECT список_столбцов FROM таблица2;

Чтобы лучше понять, как работает оператор UNION, предположим, что в таблицах employees и customers существуют некоторые гипотетические поля first_name и last_name. Обратите внимание, что эти поля на самом деле не существуют в демонстрационных таблицах.

Таблица employees

Таблица customers

+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
|  1 | Ethan      | Hunt      |   5000 |
|  2 | Tony       | Montana   |   6500 |
|  3 | Sarah      | Connor    |   8000 |
|  4 | Rick       | Deckard   |   7200 |
|  5 | Martin     | Blank     |   5600 |
+----+------------+-----------+--------+
+----+------------+-----------+----------+
| id | first_name | last_name | city     |
+----+------------+-----------+----------+
|  1 | Maria      | Anders    | Berlin   |
|  2 | Fran       | Wilson    | Madrid   |
|  3 | Dominique  | Perrier   | Paris    |
|  4 | Martin     | Blank     | Turin    |
|  5 | Thomas     | Hardy     | Portland |
+----+------------+-----------+----------+

Выполним оператор UNION, чтобы объединить результаты двух запросов.

Следующая команда вернет имена и фамилии всех клиентов и сотрудников:

SELECT first_name, last_name FROM employees 
UNION
SELECT first_name, last_name FROM customers;

После выполнения приведенной выше команды вы получите такой результат:

+---------------+--------------+
| first_name    | last_name    |
+---------------+--------------+
| Ethan         | Hunt         |
| Tony          | Montana      |
| Sarah         | Connor       |
| Rick          | Deckard      |
| Martin        | Blank        |
| Maria         | Anders       |
| Fran          | Wilson       |
| Dominique     | Perrier      |
| Thomas        | Hardy        |
+---------------+--------------+

Оператор UNION по умолчанию удаляет дублирующиеся строки из объединенного набора результатов. Вот почему приведенный выше запрос возвращает только 9 строк. Если вы заметили, имя Martin Blank встречается и в таблице employees, и в таблице customers

Однако если вы хотите оставить дублирующиеся строки, используйте ключевое слово ALL, как показано ниже:

SELECT first_name, last_name FROM employees 
UNION ALL
SELECT first_name, last_name FROM customers;
Проверьте себя
1. Чем UNION отличается от JOIN?
AUNION объединяет столбцы, JOIN — строки
BUNION объединяет строки вертикально (добавляет строки), JOIN — горизонтально (добавляет столбцы)
CUNION работает только с таблицами, JOIN — с любыми запросами
DНикакой разницы — это синонимы
2. Что происходит с дублирующимися строками при использовании UNION (без ALL)?
AДубликаты сохраняются — UNION никогда не удаляет строки
BДубликаты удаляются — в результат попадает только одна копия каждой уникальной строки
CДублирующиеся строки помечаются специальным флагом
DЗапрос завершается ошибкой при наличии дубликатов
3. Какое условие обязательно для использования UNION двух SELECT?
AТаблицы должны быть одинакового размера
BОба SELECT должны использовать WHERE
CSELECT должны быть из одной базы данных
DКоличество и порядок столбцов должны совпадать, а типы данных — быть совместимыми
4. Два SELECT: первый из таблицы employees (10 уникальных строк), второй из customers (10 уникальных строк), но 2 строки одинаковые в обеих. UNION вернёт сколько строк?
A18 строк
B20 строк
C2 строки
D10 строк