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