Предикат выборки
Функция
Определение условия выборки.
Спецификация
::=
::=
Синтаксические правила
-
Типы данных
< значимого выражения >
и< запроса выборки >
должны быть совместимы. -
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'));