[프로그래머스(Programmers)][SQL] (Lv4) 우유와 요거트가 담긴 장바구니 <Summer/Winter Coding(2019)>

728x90

 

https://programmers.co.kr/learn/courses/30/lessons/62284

 

코딩테스트 연습 - 우유와 요거트가 담긴 장바구니

CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다. CART_PRODUCTS 테이블의 구조는 다음과 같으며, ID, CART_ID, NAME, PRICE는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가

programmers.co.kr

 

 

우유( Milk )와 요거트( Yogurt )를 동시에 구입한 장바구니의 아이디오름차순으로 조회하는 SQL 문

 

#  우유를 구입한 장바구니 아이디와, 요거트를 구입한 장바구니 아이디의 교집합을 구하는 방법

/* Oracle DB 에서만 가능한 방법 ( MySQL 에서는 INTERSECT 연산을 지원하지 않음 ) */
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk'
INTERSECT
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Yogurt'
ORDER BY 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' 
	)
ORDER BY CART_ID;

## EXISTS
SELECT CART_ID 
FROM CART_PRODUCTS A
WHERE NAME = 'Milk' 
	AND EXISTS (
		SELECT CART_ID
		FROM CART_PRODUCTS B
		WHERE A.CART_ID = B.CART_ID AND NAME = 'Yogurt'
	)
ORDER BY CART_ID;

 

#  셀프 조인( 같은 테이블끼리 조인 ) 하여 각각 별칭 지정 후 하나는 우유, 다른 하나는 요거트 조건 지정하는 방법

SELECT DISTINCT CART_ID
FROM CART_PRODUCTS A JOIN CART_PRODUCTS B
USING ( CART_ID )
WHERE A.NAME = 'Milk' AND B.NAME = 'Yogurt'
ORDER BY CART_ID;

 

#  장바구니 아이디를 기준으로 구입한 상품의 종류의 수가 우유, 요거트 2 개인 것을 구하는 방법
  ( 종류( NAME ) 에 대해 중복 제거( DISTINCT ) 후 수행  --  예를 들어 우유 종류만 각각 다른 제품으로 여러 개 구입 했을 수도 있으므로 ) 

SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ( 'Milk', 'Yogurt' )
GROUP BY CART_ID
HAVING COUNT( DISTINCT( NAME ) ) = 2
ORDER BY CART_ID;

 

 

반응형