Справка по 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 и все результаты сравнения значения выражения и каждого