РУКОВОДСТВО ПО РЕЛЯЦИОННОЙ СУБД DB2

ЗАПРОС, ТРЕБУЮЩИЙ ИСПОЛЬЗОВАНИЯ UNION


Выдать номера деталей, которые имеют вес более 16 фунтов либо поставляются поставщиком S2 (либо то и другое).

SELECT                НОМЕР_ДЕТАЛИ

FROM                   P

WHERE                BEC>16

UNION

SELECT                НОМЕР_ДЕТАЛИ

FROM                   SP

WHERE                НОМЕР_ПОСТАВЩИКА ='S2';

Результат:

P1

P2

P3

P6



Из этого простого примера следует несколько соображений:

—Избыточные дубликаты всегда исключаются, из результата UNION. Поэтому, хотя в рассматриваемом примере деталь P2 выбирается обеими из двух составляющих предложений SELECT, в окончательном результате она появляется только один раз.

—Любое число предложений SELECT может быть соединено операторами UNION. Можно расширить данный пример с тем, чтобы включить номера красных деталей, дополнив приведенный выше запрос следующей конструкцией:

UNION

SELECT                НОМЕР_ДЕТАЛИ

FROM                   P

WHERE                ЦВЕТ = 'Красный'

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

SELECT фразу OR ЦBET= ='Красный'.

—Любая фраза ORDER BY в запросе должна входить как часть только в последнее предложение SELECT и должна указывать столбцы, по которым осуществляется упорядочение, путем указания их порядковых позиций, т. е. их номеров.

—В связи с оператором

UNION часто оказывается полезной возможность включения констант во фразу SELECT. Например, можно указать, какому из двух условий WHERE удовлетворяет каждая из отдельных деталей:

SELECT                НОМЕР_ДЕТАЛИ, 'ее вес > 16 фунтов'

FROM                   P

WHERE                ВЕС > 16

UNION

SELECT                НОМЕР_ДЕТАЛИ, 'деталь поставляется S2'

FROM                   SP

WHERE                НОМЕР_ПОСТАВЩИКА = 'S3'

ORDER                BY 2, 1;

Результат:

PI

Р2

Р2

РЗ

Р6

деталь поставляется S2

деталь поставляется S2

ее вес > 16 фунтов

ее вес > 16 фунтов

ее вес > 16 фунтов


Когда строковая константа выступает в качестве элемента, подлежащего выборке, считается, что она имеет тип VARCHAR и длину, равную числу литер в константе, и допускаются неопределенные значения.

У читателя может возникнуть желание узнать, поддерживаются ли в языке SQL какие-либо аналоги операторов INTERSECTION (пересечение) и DIFFERENCE (разность), поскольку объединение, пересечение и разность в теоретико-множественных рассмотрениях обычно выступают совместно. Пересечение двух множеств представляет собой множество всех элементов, принадлежащих обоим исходным множествам. Разность двух множеств — это множество элементов, принадлежащих первому исходному множеству, но не принадлежащих второму. В языке SQL эти два оператора непосредственно не поддерживаются, но каждый из них может быть смоделирован с помощью функции EXISTS. Пусть, например, А и В—таблицы, состоящие из единственного столбца, а именно, столбца номеров поставщиков. Пусть А представляет «поставщиков из Лондона», а В — «поставщиков, которые поставляют деталь Р1». Тогда

SELECT                НОМЕР_ПОСТАВЩИКА

FROM                   A

WHERE                EXISTS

(SELECT         НОМЕР_ПОСТАВЩИКА

FROM              В

WHERE           В. НОМЕР_ПОСТАВЩИКА=

А. НОМЕР_ПОСТАВЩИКА);

представляет пересечение А и В, т. е. поставщиков из Лондона, которые поставляют деталь P1, a

SELECT                НОМЕР_ПОСТАВЩИКА

FROM                   A

WHERE                NOT EXISTS

(SELECT         НОМЕР_ПОСТАВЩИКА

FROM              В

WHERE           В.НОМЕР_ПОСТАВЩИКА=

А. НОМЕР_ПОСТАВЩИКА);

представляет разность между А и В (в указанном порядке), т. е. поставщиков из Лондона, которые не поставляют деталь Р1. Упражнение.

Что представляет собой разность между В и А (именно в этом порядке)?


Содержание раздела