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

Функция

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

Спецификация
   
< условие >::=
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'));