Команда UNION просто объединяет вывод нескольких запросов в один. Например, приведенный ниже запрос выводит всех агентов и заказчиков, размещенных в :
SELECT snum, sname FROM Salespeople WHERE city = 'Москва' UNION SELECT cnum, cname FROM Customers WHERE city = 'Москва'Результат:
snum sname ----- ------------------ 2001 ТОО Рога и копыта 1001 Иванов
Тип данных колонки | Тип результата |
---|---|
Обе колонки типа char с фиксированными длинами L1 и L2 | char с длиной равной наибольшему из L1 и L2 |
Обе колонки типа binary c фиксированной длиной L1 и L2 | binary с длиной равной наибольшему из L1 и L2 |
Одна или обе типа varchar | varchar с длиной равной наибольшему из L1 и L2 |
Одна или обе типа varbinary | varbinary с длиной равной наибольшему из L1 и L2 |
Обе числового типа (smallint,money, float) | Тип данных с наибольшей точностью (int=>float) |
UNION автоматически исключает дубликаты строк из вывода. Если вы хотите, чтобы все строки из запросов попали в результат используйте UNION ALL:
SELECT snum, city FROM Customers UNION ALL SELECT snum, city FROM SalespeopleРезультат:
snum city ----- ----------- 1001 Москва 1003 Одесса 1002 Рязань 1002 Бобруйск 1001 Лондон 1004 ТОМСК 1007 Караганда 1001 Москва 1002 Хабаровск 1003 Караганда 1004 Сочи 1007 Красноярск
Вместе с UNION может использоваться ORDER BY для упорядочивания вывода. При этом ORDER BY указывается только после последнего запроса, входящего в UNION.
SELECT a.snum, sname, onum, 'Наибольший на ',odate FROM Salespeople a, Orders b WHERE a.snum = b.snum AND b.amt = ( SELECT MAX(amt) FROM Orders c WHERE c.odate = b.odate ) UNION SELECT a.snum, sname, onum, 'Наименьший на ', odate FROM Salespeople a, Orders b WHERE a.snum = b.snum AND b.amt = ( SELECT MIN(amt) FROM Orders c WHERE c.odate = b.odate ) ORDER BY 3
Результат:
snum sname onum odate ----- ------- ----- -------------- ----------- 1007 Шилин 3001 Наименьший на 1999-10-03 1002 Петров 3005 Наибольший на 1999-10-03 1002 Петров 3007 Наименьший на 1999-10-04 1001 Иванов 3008 Наименьший на 1999-10-05 1001 Иванов 3008 Наибольший на 1999-10-05 1003 Егоров 3009 Наибольший на 1999-10-04 1002 Петров 3010 Наименьший на 1999-10-06 1001 Иванов 3011 Наибольший на 1999-10-06
3 - просто номер колонки вывода. Так проще сортировать записи, т.к. при использовании UNION имена колонок могут выглядеть как угодно.
Теперь вы знаете как объединять произвольное количество запросов в единый вывод. Если у вас есть несколько подобных таблиц, принадлежащих разным пользователям, объединение предоставляет удобный способ их слияния и упорядочивания.
Этим заканчиваются шаги о запросах. Далее нам предстоит узнать о том, как данные вводятся в таблицы и как создаются собственно таблицы и все, что с этим связано. Запросы будут постоянно встречаться в других типах команд. Следующие шаги будут посвящены: командам вставки, обновления и удаления записей.