Предикат выборки
Функция
Определение условия выборки.
Спецификация
::=
::=
Синтаксические правила
-
Типы данных
<значимого выражения>
и<запроса выборки>
должны быть совместимы. -
ANY
является синонимомSOME
.
Общие правила
-
<Условие> ANY
берет все записи выборки данных, возвращаемые<запросом выборки>
, и оценивает их как верные, если хотя бы один из них удовлетворяет<операции сравнения>
.SELECT Name FROM Person WHERE PersonID = ANY(SELECT PersonID FROM Auto); select distinct c1 from tab1, tab2 where c1<>c2;
это то же самое, что
select c1 from tab1 where c1<> any (select c2 from tab2);
-
<Условие> ALL
берет все записи выборки данных, возвращаемые<запросом выборки>
, и оценивает их как верные, если все они удовлетворяют<предикат сравнения>
.SELECT Name FROM Person WHERE Salary <= ALL (SELECT Salary FROM Person);
-
Результат
<предиката выборки>
выводится путем применения<предиката сравнения>
к каждой записи выборки данных из<запроса выборки>
. При этом возможны следующие ситуации:-
если
<запрос выборки>
пуст, или<предикат сравнения>
является истинным для каждой записи выборки данных из<запроса выборки>
, то результат<значимое выражение> <предикат сравнения> ALL(<запрос выборки>)
имеет значение «истина» (TRUE); -
если
<предикат сравнения>
имеет значение «ложь» (FALSE) хотя бы для одной записи выборки данных из<запроса выборки>
, то результат<значимое выражение> <предикат сравнения> ALL(<запрос выборки>)
имеет значение «ложь» (FALSE);Получить список лиц, чья зарплата больше, чем у всех остальных:
SELECT Name FROM Person WHERE Salary >= ALL (SELECT Salary FROM Person);
-
если
<предикат сравнения>
имеет значение «истина» (TRUE) хотя бы для одной записи выборки данных из<запроса выборки>
, то результат<значимое выражение> <предикат сравнения> {SOME | ANY} <запрос выборки>
имеет значение «истина» (TRUE);Удалить из table_1 те строки, номера которых встречаются в table_2:
delete from table_1 where number = ANY (select some_numbers from table_2)
-
если результат
<запроса выборки>
пуст или результатом неявно заданного<предиката сравнения>
для каждой записи выборки данных из<запроса выборки>
является «ложь» (FALSE), то результатом<значимое выражение> <предикат сравнения> {SOME | ANY} <запрос выборки>
будет «ложь» (FALSE); -
если результатом
<предиката выборки>
не являются ни TRUE, ни FALSE, значение его не определено (NULL-значение).
-
Примечание
Кванторные предикаты c помощью отрицания легко преобразовываются один в другой: ALL к ANY и обратно. С другой стороны, нет такого запроса, сформулированного с их использованием, который нельзя было бы в равной степени хорошо, и даже лучше, сформулировать, используя EXISTS, IN-предикат и агрегатные функции, например:
select c1 from tab1 where c1<> all (select c2 from tab2);
эквивалентно
select c1 from tab1 where c1 not in (select c2 from tab2);
или
select c1 from tab1 where not exists (select c2 from tab2 where c1=c2);
Примеры
-
create or replace table "Справочник автопроизводителей" (make char(20)); insert into "Справочник автопроизводителей" values('FORD'); insert into "Справочник автопроизводителей" values('VAZ'); insert into "Справочник автопроизводителей" values('FIAT');
-
SELECT count(make) FROM auto WHERE make = ANY(table "Справочник автопроизводителей" ); | 143|
-
SELECT count(make) FROM auto WHERE make = ANY(values ('FORD'));