Я начал использовать sql и много слышал о операторах ANY
и ALL
. Может ли кто-нибудь объяснить мне, какие запросы они используют и как они работают?
Операторы SQL ANY & ALL
Ответ 1
Операторы ANY
и ALL
позволяют выполнять сравнение между значением одного столбца и рядом других значений. Например:
select * from Table1 t1 where t1.Col1 < ANY(select value from Table2)
ANY
означает, что условие будет выполнено, если операция верна для любого из значений в диапазоне. ALL
означает, что условие будет выполняться, только если операция верна для всех значений в диапазоне.
Чтобы использовать пример, который может приближаться к дому, выполните следующее:
select * from Table1 t1 where t1.Col1 = ANY(select value from Table2)
То же самое, что и при этом:
select * from Table1 t1 where t1.Col1 in (select value from Table2)
Ответ 2
Я много слышал о
ANY
и ОператорыALL
Я слегка удивлен: я редко вижу, что они использовали себя. Чаще всего встречаются WHERE val IN (subquery)
и WHERE EXISTS (subquery)
.
Заимствовать пример @Adam Robinson:
SELECT *
FROM Table1 AS t1
WHERE t1.Col1 < ANY (
SELECT value
FROM Table2
);
Я обычно вижу это следующим образом:
SELECT *
FROM Table1 AS t1
WHERE EXISTS (
SELECT *
FROM Table2 AS t2
WHERE t1.Col1 < t2.value
);
Я нахожу эту конструкцию более легкой для чтения, потому что параметры предиката (t1.Col1
и t2.value
соответственно) ближе друг к другу.
Ответ 3
Добавляя к Адаму ответ, будьте осторожны, что синтаксис может быть неоднозначным:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
Здесь ANY можно рассматривать либо как введение подзапроса, либо как функцию агрегата, если подзапрос возвращает одну строку с булевым значением. (через postgresql.org)