Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Использование

предло»Сения

UNION

Глава 14. Ис11ользование 11редложения UNION

В предшествующих главах обсуждались различные варианты запросов с распо­

ложением "один внутри другого". Существует другой способ комбинирования множе­ ства запросов - их объединение. В этой главе объясняются предложения UNION в SQL. Объединения (иnions) отличаются от подзапросов тем, что любой из двух (или большего числа) запросов не может управлять другим запросом. В объединении все запросы выполняются независимо, но их выходные данные затем объединяются.

Объединение множества запросов в один

Можно задать множество запросов одновременно и комбинировать их выходные данные с использованием предложения UNION. UNION объединяет выходные данные двух или более SQL-запросов в единое множество строк и столбцов. Для того чтобы получить сведения обо всех продавцах (sa\espeop\e) и покупателях (customers) Лондо­

на в виде выходных данных одного запроса, следует ввести:

SELECT snum, sname

FROM Salespeople

WHERE city = 'London'

UNION

SELECT cnum, cname

FROM Customers

WHERE city = 'London·;

(выходные данные представлены на рис. 14,l).

Столбцы, выбранные с помощью двух команд, представлены в выходных данных так, как если бы они выбирались с помощью одного запроса. Заголовки столбцов опущены, поскольку в результат объединения входят столбцы из нескольких разных таблиц. Таким образом столбцы в выходных данных не поименованы.

Только последний запрос заканчивается точкой с запятой. Отсутствие этого знака дает возможность SQL распознать, что следует еще один запрос.

Когда можно выполнить объединение запросов?

Для того, чтобы два или более запроса можно было объединить (выполнить коман­ ду UNION), их столбцы, входящие в состав выходных данных, должны быть совмес­ тил1ы 110 объединению (иnion compatiЬ/e). Это значит, что в каждом из запросов может быть указано одинаковое количество столбцов в таком порядке: первый, второй, тре-

146

Объединение миожества за11росов в один

Рис. 14.1. Формирование объединения двух запросов

тий и т.д., - причем, первые столбцы каждого из запросов являются сравнимыми, вторые столбцы каждого из них - также сравнимы и т.д. по всем столбцам, включае­ мым в состав выходных данных. Значение термина "столбцы сравнимы" может ме­ няться. ANSI определяет его очень просто: числовые поля должны иметь полностью

совпадающие тип и размер. (В приложении В детально описаны числовые типы

ANSI.) Символьные поля должны иметь точно совпадающее количество символов (это означает, что одинаковое количество выделено, но вовсе не обязательно заполне­ но).

Некоторые программные продукты SQL используют более гибкие определения. Например, нестандартные с точки зрения ANSI типы, такие как DATE и BINARY, обычно сравнимы со столбцами этих же нестандартных типов. Длина столбцов тоже является проблемой. Многие программные продукты не требуют совпадения длин, но такие столбцы нельзя использовать в UNION. С другой стороны, некоторые продукты (и ANSI) требуют, чтобы длины символьных полей точно совпадали. По этим причи­

нам всегда следует ознакомиться с документацией по конкретному программному

продукту.

Другое ограничение на сравнимость состоит в том, что если NULL-значения за­

прещены для любого столбца в объединении, то они должны быть запрещены для всех соответствующих столбцов в других запросах объединения. NULL-значения запреща­ ются с помощью ограничения NOT NULL, о котором идет речь в главе 18. Нельзя ис­ пользовать UNION в подзапросах также, как и функции агрегирования в предложениях SELECT запросов в объединении (многие программные продукты смягчают эти ограничения).

147

Глава 14. Ис11ользование предложения U1VION

UNION и устранение дублирования

UNION автоматически исключает из выходных данных дублирующиеся строки. Не возбраняется, но и не имеет особого смысла применение в SQL оператора DISТINCT в отдельных запросах для исключения повторяющихся значений. Приме­ ром может служить следующий запрос, выходные данные для которого изображены

на рис. 14.2.:

SELECT snum, city

FROM Customers;

Рис. 14.2. Простой запрос с повторяющимися выходными данными

Среди них есть повторяющаяся комбинация значений (1001 с London), поскольку в запросе SQL не требуется исключать дубликаты (повторяющиеся значения). Однако, если применяется UNION для комбинации этого запроса с таким же запросом для таб­ лицы Salespeople, избыточная комбинация исключается. На рис. 14.3 представлены

выходные данные для следующего запроса:

SELECT snum, city

FROM Customers

UIOON

SELECT snum, city

FROM Salespeople:

Можно добиться того же (в некоторых программных продуктах SQL), указав

UNION ALL вместо UNION:

148

Объединение мноJtеества за1~росов в один

1001 London

1002 Berlin

1002 San Jose

1003 New York

1003 Rome

1004 london

101/.14 Rome

101/.17 Barcelona

1007 San Jose

Рис. 14.3. Объединение исключает повторяющиеся выходные данные

SELECT snum, city

FROM Customers

UNION ALL

SELECT snum, city

FROM Salespeople;

Использование строк и выражений с UNION

Иногда можно вставлять константы и выражения в предложения SELECT, исполь­ зующие UNION. Это не соответствует в точности стандарту ANSI, но часто и оправдан­

но применяется. Однако применяемые константы и выражения должны при этом

удовлетворять стандарту сравнимости, о котором упоминалось ранее. Такая процедура

может оказаться полезной, например, для формулировки комментария, определяющего,

из какого конкретно запроса получена данная строка.

Предположим, необходимо сделать отчет, содержащий сведения для каждого продавца о его максимальном и минимальном заказах по каждой дате. Можно объе­ динить два запроса, вставив соответствующий текст в качестве комментария, для того чтобы различить каждый из двух случаев (минимальный заказ и максимальный заказ).

149

Источник: https://studfile.net/preview/16418473/