Предикат выборки

Функция

Определение условия выборки.

Спецификация
   
<условие>::=
ALL | {SOME | ANY}
Синтаксические правила
  1. Типы данных <значимого выражения> и <запроса выборки> должны быть совместимы.

  2. ANY является синонимом SOME.

Общие правила
  1. <Условие> 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);
  2. <Условие> ALL берет все записи выборки данных, возвращаемые <запросом выборки>, и оценивает их как верные, если все они удовлетворяют <предикат сравнения>.

    SELECT Name FROM Person
     WHERE Salary <= ALL (SELECT Salary FROM Person);
  3. Результат <предиката выборки> выводится путем применения <предиката сравнения> к каждой записи выборки данных из <запроса выборки>. При этом возможны следующие ситуации:

    • если <запрос выборки> пуст, или <предикат сравнения> является истинным для каждой записи выборки данных из <запроса выборки>, то результат <значимое выражение> <предикат сравнения> 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);
Примеры
  1. create or replace table "Справочник автопроизводителей" (make char(20));
    insert into "Справочник автопроизводителей"  values('FORD');
    insert into "Справочник автопроизводителей"  values('VAZ');
    insert into "Справочник автопроизводителей"  values('FIAT');
  2. SELECT count(make)  FROM auto
     WHERE make = ANY(table "Справочник автопроизводителей" );
    |        143|
  3. SELECT count(make) FROM auto WHERE make = ANY(values ('FORD'));