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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: