오라클에서 ANY와 ALL의 차이에 대해 알아봅시다. 목차는 다음과 같습니다.
- ANY와 SOME은 동일한 기능을 제공합니다.
- ANY는 어느 하나라도, 적어도 1개, 어떤 것이든 정도로 해석하시면 됩니다.
- ALL은 모든 조건 충족을 생각하시면 됩니다.
ANY, SOME
ANY 연산자와 SOME 연산자는 동일한 기능을 제공합니다. 혼용하여 사용해도 무방합니다만, 개발규칙을 정하여 통합해서 사용하는 편이 좋습니다. 저는 보통 ANY 연산자를 주로 사용합니다.
ANY
ANY 연산자는 '어느 하나라도', '적어도 1개', '어떤 것이든' 정도로 해석하면 이해하기 쉽습니다. 이번 예제에서 사용할 쿼리를 살펴보겠습니다.
SELECT COL "COL ? ANY(3,6,9)",
CASE WHEN COL = ANY (3, 6, 9) THEN 'true' ELSE NULL END "=",
CASE WHEN COL >= ANY (3, 6, 9) THEN 'true' ELSE NULL END ">=",
CASE WHEN COL > ANY (3, 6, 9) THEN 'true' ELSE NULL END ">",
CASE WHEN COL <= ANY (3, 6, 9) THEN 'true' ELSE NULL END "<=",
CASE WHEN COL < ANY (3, 6, 9) THEN 'true' ELSE NULL END "<",
CASE WHEN COL <> ANY (3, 6, 9) THEN 'true' ELSE NULL END "<>"
FROM ( SELECT LEVEL COL
FROM DUAL
CONNECT BY LEVEL <= 10);
COL ? ANY(3,6,9) = >= > <= < <>
---------------- -------- -------- -------- -------- -------- --------
1 true true true
2 true true true
3 true true true true true
4 true true true true true
5 true true true true true
6 true true true true true true
7 true true true true true
8 true true true true true
9 true true true true true
10 true true true
10 rows selected.
1부터 10까지의 숫자에 대해, ANY(3,6,9) 연산자가 어떻게 작동하는지 보여드리겠습니다.
= ANY(3,6,9) 이면 어떠한 값이든 '3'이거나 '6'이거나 '9'이면 참입니다.
>= ANY(3,6,9) 이면 '3 이상'이어도 되고, '6 이상'이어도 되고, '9 이상'이어도 됩니다. 그러니 가장 넓은 범위를 포함하는 '3 이상'이면 참입니다.
> ANY(3,6,9) 이면 '3 초과' 혹은 '6 초과' 혹은 '9 초과' 중 하나의 조건만 만족하면 되므로, '3 초과' 하면 참입니다.
상기의 사항은 이하, 미만에도 동일하게 적용이 됩니다.
<= ANY(3,6,9) 이면 '3 이하'여도 되고, '6 이하'여도 되고, '9 이하'여도 되니 가장 넓은 범위의 '9 이하'이면 참입니다.
< ANY(3,6,9) 부분에서도 초과와 마찬가지로 '9 미만'이기만 하면 됩니다.
<> ANY(3,6,9)는 모든 값이 참입니다. 서로 다른 x, y에 대해 어떠한 값이든 x가 아니거나 y가 아닌 경우는 항상 참이기 때문이랍니다. (ANY 연산자에 서로 다른 복수 개의 인수가 존재한다면 항상 참입니다.)
ALL
ALL은 나열한 모든 조건을 충족해야 합니다. 예제 자료를 살펴보겠습니다.
SELECT COL "COL ? ALL(3,6,9)",
CASE WHEN COL = ALL (3, 6, 9) THEN 'true' ELSE NULL END "=",
CASE WHEN COL >= ALL (3, 6, 9) THEN 'true' ELSE NULL END ">=",
CASE WHEN COL > ALL (3, 6, 9) THEN 'true' ELSE NULL END ">",
CASE WHEN COL <= ALL (3, 6, 9) THEN 'true' ELSE NULL END "<=",
CASE WHEN COL < ALL (3, 6, 9) THEN 'true' ELSE NULL END "<",
CASE WHEN COL <> ALL (3, 6, 9) THEN 'true' ELSE NULL END "<>"
FROM ( SELECT LEVEL COL
FROM DUAL
CONNECT BY LEVEL <= 10);
COL ? ALL(3,6,9) = >= > <= < <>
---------------- -------- -------- -------- -------- -------- --------
1 true true true
2 true true true
3 true
4 true
5 true
6
7 true
8 true
9 true
10 true true true
10 rows selected.
= ALL(3,6,9) 이면 값이 '3'이면서 동시에 '6'이고, '9' 여야 참이 되는데, <> ANY와 반대로 서로 다른 x, y에 대해 열값이 x 이면서 y 일 수는 없기 때문에 항상 거짓입니다. ALL 연산자에 복수 개의 다른 컬럼을 비교하면 거짓이랍니다.
>= ALL(3,6,9) 이면 '3 이상'이어야 하고, '6 이상'이어야 하며 또한 '9 이상'이어야 합니다. 해당 값을 만족하는 경우는 값이 '9 이상'일 때입니다.
> 초과 또한 위와 마찬가지입니다. 3초과 + 6초과 + 9초과 모든 조건을 만족하는 값은 해당 예시에서 10입니다.
이하, 미만도 위에서 유추할 수 있을 것입니다.
<= ALL(3,6,9) 이면 해당 값이 '3 이하'여야 하며, '6 이하'도 충족하고, '9 이하'인 조건도 만족해야 합니다. 그리하여 '3 이하'인 값이 참이 됩니다.
< ALL(3,6,9) 연산자는 '3 미만', '6 미만', '9 미만' 이어야 하기에, '3 미만'일 때 참입니다.
<> ALL(3,6,9)는 컬럼이 '3'도 아니고 '6'도 아니고 '9'도 아니면 참입니다. 그리하여 '3','6','9'를 제외한 값을 조회합니다.