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