Команда 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 условие
Таблицы для примеров
id айди |
name название |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
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
,
которая объединяет связанные таблицы