Выдать номера деталей, которые имеют вес более 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. Упражнение.
Что представляет собой разность между В и А (именно в этом порядке)?