Справка по SQL | страница 15




maker

A


Пример на разность. Найти тех производителей ПК-блокнотов, которые не производят принтеров:


>SELECT DISTINCT maker

>FROM Product AS Lap_product

>WHERE type = 'Laptop' AND NOT EXISTS

> (SELECT maker

> FROM Product

> WHERE type = 'Printer' AND maker = Lap_product.maker);


В этом случае достаточно заменить в предыдущем примере EXIST на NOT EXIST. Т.е. выходные данные составят только те уникальные строки основного запроса, для которых подзапрос не возвращает ни одной строки. В итоге получим:


maker

B

C


Использование ключевых слов SOME | ANY и ALL с предикатами сравнения



<оператор сравнения SOME|ANY () SOME и ANY являются синонимами, т.е. может использоваться любое из них. Результатом подзапроса является один столбец величин. Если для какого-нибудь значения V, получаемого из подзапроса, результат операции " V " равняется TRUE, то предикат ANY также равняется TRUE.


ALL ()

исполняется так же, как и ANY, но для всех значений, получаемых из подзапроса, проверка должна удовлетворять результату TRUE для предиката " V ".

Пример. Найти поставщиков компьютеров, моделей которых нет в продаже (т.е. отсутствуют в таблице PC):


>SELECT DISTINCT maker

>FROM Product

>WHERE type = 'PC' AND NOT model = ANY

> (SELECT model

> FROM PC);


Оказалось, что только у поставщика Е есть модели отсутствующие в продаже:


maker

E


Рассмотрим подробно этот пример. Предикат

model = ANY (SELECT model FROM PC);

вернет значение TRUE, если модель, определяемая полем model основного запроса, найдется в списке моделей таблицы PC (возвращаемом подзапросом). Поскольку предикат используется в запросе с отрицанием NOT, то значение TRUE будет получено, если модели не окажется в списке. Этот предикат проверяется для каждой записи основного запроса, которыми являются все модели ПК (предикат type = 'PC') из таблицы Product. Результирующий набор состоит из одного столбца - имени производителя. Чтобы один производитель не выводился несколько раз (что может случиться, если он производит несколько моделей, отсутствующих в таблице PC), используется служебное слово DISTINCT.

Пример. Найти модели и цены ПК-блокнотов, стоимость которых превышает стоимость любого ПК:


>SELECT DISTINCT model, price

>FROM Laptop

>WHERE price ALL

> (SELECT price

> FROM PC);


model

price

1298

1050.0

1750

1200.0

1752

1150.0


Приведем формальные правила оценки предикатов, использующих параметры ANY|SOME и ALL:

* Если определен параметр ALL или SOME и все результаты сравнения значения выражения и каждого