
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('MILK', 'YOGURT')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2
ORDER BY CART_ID;
WHERE NAME IN (...)
Milk, Yogurt 중 하나인 항목들만 필터링
GROUP BY CART_ID
장바구니 ID별로 묶기
HAVING COUNT(DISTINCT NAME) = 2
이름이 두 개(Milk, Yogurt) 모두 포함된 것만 남김
동시에 존재하는 값"을 찾을 땐
→ GROUP BY + HAVING COUNT(DISTINCT ...) = 개수
SELECT CP1.CART_ID
FROM CART_PRODUCTS CP1
WHERE CP1.NAME = 'MILK'
AND EXISTS(
SELECT 1
FROM CART_PRODUCTS CP2
WHERE CP1.CART_ID = CP2.CART_ID
AND CP2.NAME = 'YOGURT'
)
ORDER BY CP1.CART_ID;
코드 흐름
바깥 쿼리: Milk가 들어있는 CART_ID들을 찾는다
EXISTS 서브쿼리: 같은 CART_ID 안에 Yogurt도 있는지 확인
→ 두 조건을 동시에 만족하는 장바구니만 반환
SELECT CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN (
SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'MILK'
)
AND CART_ID IN (
SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'YOGURT'
)
GROUP BY CART_ID
ORDER BY CART_ID
Milk가 있는 CART_ID
Yogurt가 있는 CART_ID
→ 두 조건을 모두 만족하는 CART_ID만 추림
GROUP BY + HAVING
제일 직관적이고 성능도 좋음 (실무, 문제 풀이)
EXISTS 서브쿼리
SQL 트릭 이해에 좋음 (상황에 따라 복잡)
IN 두 번
논리적으로 명확함 (읽기 쉬움, 성능은 중간)