Команда UNION объединяет данные из нескольких таблиц в одну при выборке.

При объединении количество столбцов во всех таблицах должно совпадать, иначе будет ошибка

Имена столбцов будут такие же, как в основной таблице, в которую добавляются данные из других таблиц.

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

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

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

Синтаксис

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

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 и cities, если не сказано иное.

Таблица 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

SQL запрос выберет следующие строки:

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

Пример

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

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

SQL запрос выберет следующие строки:

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

Пример

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

SELECT name FROM countries UNION SELECT name FROM cities

SQL запрос выберет следующие строки:

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

Пример

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

SELECT name FROM countries UNION ALL SELECT name FROM cities

SQL запрос выберет следующие строки:

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

Пример

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

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

SQL запрос выберет следующие строки:

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

Пример

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

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

SQL запрос выберет следующие строки:

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

SQL запрос выберет следующие строки:

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