Шаг 13 - Использование команды UNION

Команда UNION просто объединяет вывод нескольких запросов в один. Например, приведенный ниже запрос выводит всех агентов и заказчиков, размещенных в :

SELECT snum, sname
FROM Salespeople
WHERE city = 'Москва'

UNION

SELECT cnum, cname
FROM Customers
WHERE city = 'Москва'
Результат:
snum  sname              
----- ------------------ 
2001  ТОО Рога и копыта 
1001  Иванов            
Для применения команды UNION существует 2 правила:
Совместимость типов определяется просто:
Тип данных колонки Тип результата
Обе колонки типа 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 имена колонок могут выглядеть как угодно.

Теперь вы знаете как объединять произвольное количество запросов в единый вывод. Если у вас есть несколько подобных таблиц, принадлежащих разным пользователям, объединение предоставляет удобный способ их слияния и упорядочивания.

Этим заканчиваются шаги о запросах. Далее нам предстоит узнать о том, как данные вводятся в таблицы и как создаются собственно таблицы и все, что с этим связано. Запросы будут постоянно встречаться в других типах команд. Следующие шаги будут посвящены: командам вставки, обновления и удаления записей.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Aidar Talibzhanov - 03.02.2000