Использование ключевых слов SOME (ANY) и ALL с предикатами сравнения
<выражение> <[оператор сравнения](/ru/book_comparison_predicates.html/ru/book_comparison_predicates.html/ru/book_comparison_predicates.html "Операторы сравнения")> SOME | ANY (<подзапрос>)
SOME и ANY являются синонимами, то есть может использоваться любое из них. Результатом подзапроса является один столбец величин. Если хотя бы для одного значения V, получаемого из подзапроса, результат операции “<значение выражения> <оператор сравнения> V” равняется TRUE, то предикат ANY также равняется TRUE.
<выражение> <оператор сравнения> ALL (<подзапрос>)
Исполняется так же, как и ANY, однако значение предиката ALL будет истинным, если для всех значений V, получаемых из подзапроса, предикат “<значение выражения> <оператор сравнения> V” дает TRUE.
Пример 5.8.1
SELECT DISTINCT maker
FROM Product
WHERE type = 'pc'
AND NOT model = ANY (SELECT model
FROM PC
);
[[ column ]] |
---|
[[ value ]] |
Оказалось, что только у поставщика Е есть модели, отсутствующие в продаже:
Maker |
---|
E |
Рассмотрим подробно этот пример. Предикат
model = ANY (SELECT model
FROM PC
);
вернет значение TRUE, если модель, определяемая полем model основного запроса, найдется в списке моделей таблицы РС (возвращаемом подзапросом). Поскольку предикат используется в запросе с отрицанием NOT, то значение TRUE будет получено, если модели не окажется в списке. Этот предикат проверяется для каждой записи основного запроса, которыми являются все модели ПК (предикат type = ‘pc’) из таблицы Product. Результирующий набор состоит из одного столбца — имени производителя. Чтобы один производитель не выводился несколько раз (что может случиться, если он производит несколько моделей, отсутствующих в таблице РС), используется служебное слово DISTINCT, исключающее дубликаты.
Пример 5.8.2
SELECT DISTINCT model, price
FROM Laptop
WHERE price > ALL (SELECT price
FROM PC
);
[[ column ]] |
---|
[[ value ]] |
model | Price |
---|---|
1298 | 1050 |
1750 | 1200 |
1752 | 1150 |
Приведем формальные правила оценки истинности предикатов, использующих параметры ANY|SOME и ALL.
- Если определен параметр ALL или SOME и все результаты сравнения значения выражения и каждого значения, полученного из подзапроса, являются TRUE, истинностное значение равно TRUE.
- Если результат выполнения подзапроса не содержит строк и определен параметр ALL, результат равен TRUE. Если же определен параметр SOME, результат равен FALSE.
- Если определен параметр ALL и результат сравнения значения выражения хотя бы с одним значением, полученным из подзапроса, является FALSE, истинностное значение равно FALSE.
- Если определен параметр SOME и хотя бы один результат сравнения значения выражения и значения, полученного из подзапроса, является TRUE, истинностное значение равно TRUE.
- Если определен параметр SOME и каждое сравнение значения выражения и значений, полученных из подзапроса, равно FALSE, истинностное значение тоже равно FALSE.
- В любом другом случае результат будет равен UNKNOWN.