# Команда UNION

Команда `UNION` объединяет данные из нескольких таблиц в одну при выборке. При объединении количество столбцов во всех таблицах должно совпадать, иначе будет ошибка Имена столбцов будут такие же, как в основной таблице, в которую добавляются данные из других таблиц.

Внимание: если не используется ключевое слово ALL для UNION, все возвращенные строки будут уникальными, так как по умолчанию подразумевается `DISTINCT`, который удаляет неуникальные значения. Чтобы отменить такое поведение - нужно указать ключевое слово `ALL`, вот так: UNION ALL.

## Синтаксис

С удалением дублей:

`SELECT * FROM имя_таблицы1 WHERE условие UNION SELECT * FROM имя_таблицы2 WHERE условие`

Без удаления дублей:

`SELECT * FROM имя_таблицы1 WHERE условие UNION ALL SELECT * FROM имя_таблицы2 WHERE условие`

Можно объединять не две таблицы, а три или более:

`SELECT * FROM имя_таблицы1 WHERE условие UNION SELECT * FROM имя_таблицы2 WHERE условие UNION SELECT * FROM имя_таблицы3 WHERE условие UNION SELECT * FROM имя_таблицы4 WHERE условие`

## Таблицы для примеров

таблица countries
id айди | name название
--- | ---
1 | Беларусь
2 | Россия
3 | Украина

таблица cities
id айди | name название | country_id айди страны
--- | --- | ---
1 | Минск | 1
2 | Минск | 1
3 | Москва | 2
4 | Киев | 3

## Пример

В данном примере объединяются записи из двух таблиц:

`SELECT id, name FROM countries UNION ALL SELECT id, name FROM cities`

Результат выполнения кода:

id айди | name название
--- | ---
1 | Беларусь
2 | Россия
3 | Украина
1 | Минск
2 | Минск
3 | Москва
4 | Киев

## Пример

В данном примере отсутствует ключевое слово ALL, однако дубли не будут удалены, так как дублями считается полное совпадение строк:

`SELECT id, name FROM countries UNION SELECT id, name FROM cities`

Результат выполнения кода:

id айди | name название
--- | ---
1 | Беларусь
2 | Россия
3 | Украина
1 | Минск
2 | Минск
3 | Москва
4 | Киев

## Пример

А вот теперь дубли будут удалены (из двух Минсков останется один), так как будет иметь место полное совпадение строк (потому что поле осталось одно, но это не обязательно):

`SELECT name FROM countries UNION SELECT name FROM cities`

Результат выполнения кода:

name название
Беларусь
Россия
Украина
Минск
Москва
Киев

## Пример

А теперь добавим слово ALL - и дубли не будут удалятся:

`SELECT name FROM countries UNION ALL SELECT name FROM cities`

Результат выполнения кода:

name название
Беларусь
Россия
Украина
Минск
Минск
Москва
Киев

## Пример

В данном примере демонстрируется работа условий `WHERE` в комбинации с UNION:

`SELECT id, name FROM countries WHERE id>=2 UNION SELECT id, name FROM cities WHERE id<=2`

Результат выполнения кода:

id айди | name имя
--- | ---
2 | Россия
3 | Украина
1 | Минск
2 | Минск

## Пример

Имена колонок берутся из первой таблицы (то есть имена колонок таблиц, подключенных через UNION нигде себя не проявят):

`SELECT id as country_id, name as country_name FROM countries UNION SELECT id, name FROM cities`

Результат выполнения кода:

country_id айди | country_name имя
--- | ---
1 | Беларусь
2 | Россия
3 | Украина
1 | Минск | 1
2 | Минск | 1
3 | Москва | 2
4 | Киев | 3

## Пример

Такой запрос выдаст ошибку, так как в таблицах не совпадает количество колонок:

`SELECT id, name FROM countries UNION SELECT id, name, country_id FROM cities`

И такой запрос тоже выдаст ошибку в нашем случае - количество колонок в обеих таблицах не совпадает:

`SELECT * FROM countries UNION SELECT * FROM cities`

## Пример

Если нам очень надо забрать из какой-либо таблицы столько полей, что в другой таблице столько и нет, можно создавать дополнительные поля вручную.

К примеру, мы хотим забрать `3` поля из второй таблицы, а в первой таблице полей только `2`. Решим эту проблему создав поле с именем country_id и содержимым `0` для первой таблицы (вот так: 0 as country_id):

`SELECT id, name, 0 as country_id FROM countries UNION SELECT id, name, country_id FROM cities`

Результат выполнения кода:

id айди | name имя | country_id айди страны
--- | --- | ---
1 | Беларусь | 0
2 | Россия | 0
3 | Украина | 0
1 | Минск | 1
2 | Минск | 1
3 | Москва | 2
4 | Киев | 3

## Смотрите также

- команду `JOIN`,
  которая объединяет связанные таблицы

←→
↑