Команда UNION
Команда UNION объединяет данные из
нескольких таблиц в одну при выборке. При
объединении количество столбцов во всех таблицах
должно совпадать, иначе будет ошибка. Имена
столбцов будут такие же, как в основной таблице,
в которую добавляются данные из других таблиц.
Внимание: если не используется ключевое
слово ALL для UNION, все возвращенные строки
будут уникальными, так как по умолчанию подразумевается
DISTINCT,
который удаляет неуникальные значения. Чтобы
отменить такое поведение - нужно указать
ключевое слово ALL, вот так: UNION
ALL.
Синтаксис
С удалением дублей:
SELECT * FROM table_one WHERE condition
UNION SELECT * FROM table_two WHERE condition
Без удаления дублей:
SELECT * FROM table_one WHERE condition
UNION ALL SELECT * FROM table_two WHERE condition
Можно объединять не две таблицы, а три или более:
SELECT * FROM table_one WHERE condition
UNION SELECT * FROM table_two WHERE condition
UNION SELECT * FROM table_three WHERE condition
UNION SELECT * FROM table_four WHERE condition
Таблицы для примеров
| id | name |
|---|---|
| 1 | Belarus |
| 2 | Russia |
| 3 | Ukraine |
| id | name | country_id |
|---|---|---|
| 1 | Minsk | 1 |
| 2 | Minsk | 1 |
| 3 | Moscow | 2 |
| 4 | Kyiv | 3 |
Пример
Давайте объединим записи из двух таблиц:
SELECT id, name FROM countries
UNION ALL SELECT id, name FROM cities
Результат выполнения кода:
| id | name |
|---|---|
| 1 | Belarus |
| 2 | Russia |
| 3 | Ukraine |
| 1 | Minsk |
| 2 | Minsk |
| 3 | Moscow |
| 4 | Kyiv |
Пример
Давайте объединим записи без использования ключевого слова ALL, при этом дубли не будут удалены, так как дублями считается полное совпадение строк:
SELECT id, name FROM countries
UNION SELECT id, name FROM cities
Результат выполнения кода:
| id | name |
|---|---|
| 1 | Belarus |
| 2 | Russia |
| 3 | Ukraine |
| 1 | Minsk |
| 2 | Minsk |
| 3 | Moscow |
| 4 | Kyiv |
Пример
Давайте удалим дубли, так как будет иметь место полное совпадение строк (из двух Minsk останется один):
SELECT name FROM countries
UNION SELECT name FROM cities
Результат выполнения кода:
| name |
|---|
| Belarus |
| Russia |
| Ukraine |
| Minsk |
| Moscow |
| Kyiv |
Пример
Давайте добавим ключевое слово ALL, и дубли не будут удаляться:
SELECT name FROM countries
UNION ALL SELECT name FROM cities
Результат выполнения кода:
| name |
|---|
| Belarus |
| Russia |
| Ukraine |
| Minsk |
| Minsk |
| Moscow |
| Kyiv |
Пример
Давайте продемонстрируем работу условий
WHERE в комбинации с UNION:
SELECT id, name FROM countries WHERE id >= 2
UNION SELECT id, name FROM cities WHERE id <= 2
Результат выполнения кода:
| id | name |
|---|---|
| 2 | Russia |
| 3 | Ukraine |
| 1 | Minsk |
| 2 | Minsk |
Пример
Давайте используем имена колонок из первой таблицы, при этом имена колонок таблиц, подключённых через UNION, нигде себя не проявят:
SELECT id AS country_id, name AS country_name FROM countries
UNION SELECT id, name FROM cities
Результат выполнения кода:
| country_id | country_name | |
|---|---|---|
| 1 | Belarus | |
| 2 | Russia | |
| 3 | Ukraine | |
| 1 | Minsk | 1 |
| 2 | Minsk | 1 |
| 3 | Moscow | 2 |
| 4 | Kyiv | 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 | Belarus | 0 |
| 2 | Russia | 0 |
| 3 | Ukraine | 0 |
| 1 | Minsk | 1 |
| 2 | Minsk | 1 |
| 3 | Moscow | 2 |
| 4 | Kyiv | 3 |
Смотрите также
-
команду
JOIN,
которая объединяет связанные таблицы