오늘은 어제 학습한 서브쿼리에서 필터링 조건으로 사용할 수 있는
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('아메리카노', '라떼')
) ;
SELECT
*
FROM
BEVERAGES
WHERE
PRICE > ANY (SELECT PRICE FROM BEVERAGES WHERE BTYPE = 'COFFEE')
AND
BTYPE != 'COFFEE' ;

댓글
댓글 쓰기