Синтаксис команды UNION
Для объединения результатов работы нескольких запросов SELECT в единый набор данных в MySQL используется команда UNION. Команда UNION имеет следующий синтаксис:
SELECT ...
UNION [ALL]
SELECT ...
Для корректной работы команды UNION, структура наборов, которые возвращают запросы SELECT , должна быть одинаковой, чтобы их можно было совместить в один набор. То есть все запросы должны содержать одинаковое количество полей в одинаковом порядке. Поля с одним и тем же порядковым номером в разных запросах должны совпадать по типу, размеру, допустимости значения NULL.
Инструкция ALL подразумевает, что при наличии совершенно одинаковых записей в результирующий набор будут включены обе записи. Если инструкция ALL отсутствует, то по умолчанию подразумевается инструкция DISTINCT, которая исключает дубли.
Команда Union может использоваться в следующих случаях:
- Выборка данных из одной таблицы;
- Выборка данных из двух таблиц;
- Реализация оператора FULL JOIN (полного внешнего объединения).
Выборка данных из одной таблицы
Имеется таблица с фамилиями клиентов некоторого предприятия и датами обращения.
Необходимо вывести данные об обращениях клиентов с фамилиями Иванов и Петров. Эту задачу можно решить с помощью следующего запроса:
SELECT * from booking where fio LIKE "Иванов%"
UNION
SELECT * from booking where fio LIKE "Петров%";
Стоит заметить, что полностью эквивалентный результат можно получить без использования UNION, применяя логический оператор OR:
SELECT * from booking where fio LIKE "Иванов%" OR "Петров%";
Выборка данных из двух таблиц
Пуст имеется две таблицы с названиями городов и численностью населения.
Необходимо построить таблицу, куда войдут города из обеих таблиц с численностью между 3 млн. и 13млн.
SELECT city_name,population FROM city1 WHERE population>3000000 AND population
UNION
SELECT city_name,population FROM city2 WHERE population>3000000 AND population
Результат:
При наличии инструкции ORDER BY внутри запросов SELECT, следует использовать круглые скобки:
(SELECT a,b,c FROM table1 WHERE a=10 AND b=20 ORDER BY c)
UNION
(SELECT a,b,c FROM table2 WHERE c=20 OR b=30 ORDER BY b);
Реализация FULL JOIN с помощью UNION
Чаще всего команда UNION используется для реализации оператора FULL JOIN, который в MySQL отсутствует. Рассмотрим реализацию FULL JOIN на примере следующей задачи:
В базе данных хранятся две таблицы. В таблице «orders» указаны количества заказанной продукции. В таблице «prod» указано количество произведенной продукции.
При этом есть продукция, которая заказана и не произведена (Торт «Прага»), и есть продукция, которая произведена, но не заказывалась (Зефир фруктовый). Необходимо определить расхождение между заказом и реально произведенным количеством по каждому виду товара.
Если построить запрос на основе prod left join orders, то в результате будут видны все произведенные товары, но не будут видны те товары, которые были заказаны, но не были произведены.
SELECT prod.product, ifnull(prod.amount,0)-ifnull(orders.amount,0) from prod left join orders on orders.product=prod.product;
Результат:
В результирующей таблице отсутствует товар «Торт Прага».
Если построить запрос на основе orders left join prod, то в результате будут видны все заказанные товары, но не будут видны те товары, которые были произведены без предварительного заказа.
SELECT orders.product, ifnull(prod.amount,0)-ifnull(orders.amount,0) from orders left join prod on prod.product=orders.product;
Результат:
В результирующей таблице отсутствует товар «Зефир фруктовый».
Для того чтобы получить полную картину, необходимо объединить результаты двух предыдущих запросов командой UNION.
SELECT orders.product, ifnull(prod.amount,0)-ifnull(orders.amount,0) from orders left join prod on prod.product=orders.product
UNION
SELECT prod.product, ifnull(prod.amount,0)-ifnull(orders.amount,0) from prod left join orders on orders.product=prod.product;
Результат: