[MySQL_Lv4] 우유와 요거트가 담긴 장바구니. IN, HAVING

박경희·2025년 2월 28일

코딩테스트

목록 보기
66/69

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 ...) = 개수


서브쿼리 연습 겸

EXISTS 서브쿼리

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도 있는지 확인

  • → 두 조건을 동시에 만족하는 장바구니만 반환


CART_ID 기준으로 두 번의 IN

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 두 번
    논리적으로 명확함 (읽기 쉬움, 성능은 중간)

0개의 댓글