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