같은 집합, 다른 경계값
ALL은 가장 높은 문턱을, ANY는 가장 낮은 문턱을 본다
서브쿼리가 여러 가격을 돌려주면 비교 대상은 한 행이 아니라 집합 전체입니다. 그래서 price > ... 형태에서는 어떤 경계값 하나로 같은 뜻을 만들 수 있는지가 핵심입니다.
서브쿼리가 먼저 만든 도서 가격 집합
SELECT price
FROM products
WHERE category = '도서';
12000
18000
30000
이 집합을 기준으로, 외부 쿼리의 price가 어느 경계만 넘으면 되는지 ALL과 ANY가 다르게 결정합니다.
읽는 질문
ALL모든 값과 비교
ANY하나만 비교
무슨 뜻인가?
모든 도서 가격보다 비싸야 한다
집합 안에서 가장 비싼 값도 넘어야 하므로, 결국 가장 까다로운 값 하나가 기준이 됩니다.
도서 중 하나보다만 비싸면 된다
집합 안에서 가장 싼 값 하나만 넘어도 참이 되므로, 가장 쉬운 값 하나가 기준이 됩니다.
어떤 경계를 고르나?
가장 높은 가격이 마지막 문턱입니다.
MAX(price) = 30000
가장 낮은 가격이 첫 문턱입니다.
MIN(price) = 12000
같은 뜻의 SQL
price > ALL (subquery)
== price > 30000
price > ANY (subquery)
== price > 12000
정리: 같은 서브쿼리 결과라도 ALL은 집합의 최대값을, ANY는 집합의 최소값을 경계로 삼습니다. 그래서 예제의 두 쿼리는 각각 MAX, MIN으로 자연스럽게 바꿔 읽을 수 있습니다.