SQL 기초 - 서브쿼리의 필터링 IN, ANY, ALL

오늘은 어제 학습한 서브쿼리에서 필터링 조건으로 사용할 수 있는 

IN, ANY, ALL 조건에 대해서 학습하였다.


어제도 기록했다 시피, WHERE 절 서브쿼리는 단일값 혹은 다행 1컬럼의 형태로만 사용할 수 있다.

단순 비교연산자의 경우 단일값이 서브쿼리 결과로 도출되어야 하고 

IN, ANY, ALL이 적용된 경우에는 단일 컬럼 값인 경우가 적용된다.


IN의 경우 포함여부를 필터링한다. 

SELECT 
    *
FROM 
    DUAL
WHERE 
    PRICE IN (
                    SELECT
                         PRICE
                    FROM
                        DUAL 
                    WHERE
                        PRICE >= 100) ;

이렇게 된 경우 서브쿼리에서 PRICE가 100이상인 값들만 추출하여 서브쿼리 값을 만들어 놓고 해당 값들에 포함된 리스트를 도출한다. 


ANY의 경우 아래와 같이 적용할 수 있으며 예를 들어 서브쿼리에서 추출된 값이 101, 110, 120 이런형태라고 하면 최소값인 101 이상인 쿼리를 추출하는 결과를 도출한다. 

SELECT 
    *
FROM 
    DUAL
WHERE 
    PRICE > ANY (
                    SELECT
                         PRICE
                    FROM
                        DUAL 
                    WHERE
                        PRICE >= 100) ;


ALL의 경우 아래와 같이 적용할 수 있으며 예를 들어 서브쿼리에서 추출된 값이 101, 110, 120 이런형태라고 하면 최대값인  120 이상인 쿼리를 추출하는 결과를 도출한다. 

SELECT 
    *
FROM 
    DUAL
WHERE 
    PRICE > ANY (
                    SELECT
                         PRICE
                    FROM
                        DUAL 
                    WHERE
                        PRICE >= 100) ;

ANY 및 ALL 의 경우 IN과는 다르게 단순연산자와 함께 사용해야 하는것으로 이해함


다시 어제 사용했던 카페 ERD를 보고 문제풀이를 진행해보자 


문제 1. 판매량 상위 3개 음료를 조회

SELECT 

ID AS ID

, NAME AS 음료명

FROM 

BEVERAGES

WHERE

ID IN (

SELECT BEVERAGE_ID

FROM ORDER_DETAILS

GROUP BY BEVERAGE_ID

ORDER BY SUM(COUNT) DESC 

LIMIT 3

); 


처음 문제풀이한건 아래처럼 했었다. 결과는 동일함 

SELECT 

BV.ID

, BV.NAME

, SUM(OD.COUNT)

FROM 

ORDER_DETAILS OD

LEFT JOIN

BEVERAGES BV

ON OD.BEVERAGE_ID = BV.ID

GROUP BY BV.ID, BV.NAME

ORDER BY SUM(OD.COUNT) DESC 

LIMIT 3 ; 


문제 2. 아메리카노와 라떼보다 가격이 싼 음료를 조회 하시오 

SELECT 

ID AS ID

, NAME AS 음료명 

, PRICE AS 가격 

FROM 

BEVERAGES

WHERE

PRICE < ALL (

SELECT PRICE FROM BEVERAGES WHERE NAME IN('아메리카노', '라떼')

) ;


문제 3. 커피가 아닌 음료 중 커피보다 가격이 비싼것을 조회 하시오 

SELECT 

FROM 

BEVERAGES 

WHERE

PRICE > ANY (SELECT PRICE FROM BEVERAGES WHERE BTYPE = 'COFFEE')

AND 

BTYPE != 'COFFEE' ; 





댓글