-- 서브 쿼리 연습문제
/*
연습문제
1. 호날두(고객명)가 주문한 도서의 총 구매량 출력
2. ‘종로출판사’에서 출간한 도서를 구매한 적이 있는 고객명 출력
3. 베컴이 주문한 도서의 최고 주문수량보다 더 많은 도서를 구매한 고객명 출력
4. 서울에 거주하는 고객에게 판매한 도서의 총 판매량 출력
*/
-- 1. 호날두(고객명)가 주문한 도서의 총 구매량 출력
SELECT SUM(bsQty) "총 구매량" FROM bookSale
WHERE clientNo = (SELECT clientNo FROM client WHERE clientName = '호날두');
-- 서브 쿼리 결과가 단일 행인 경우에는 =과 IN 둘 다 사용 가능
SELECT SUM(bsQty) "총 구매량" FROM bookSale
WHERE clientNo IN (SELECT clientNo FROM client WHERE clientName = '호날두');
-- 2. '종로출판사'에서 출간한 도서를 구매한 적이 있는 고객명 출력
SELECT clientName FROM client
WHERE clientNo IN (SELECT clientNo FROM bookSale
WHERE bookNo IN (SELECT bookNo FROM book
WHERE pubNo IN (SELECT pubNo FROM publisher
WHERE pubName = '종로출판사')));
-- 서브 쿼리 결과가 단일 행인 경우에는 = 사용 가능
-- 결과가 다중 행인 SELECT 절에만 IN 사용 가능
SELECT clientName FROM client
WHERE clientNo IN (SELECT clientNo FROM bookSale
WHERE bookNo IN (SELECT bookNo FROM book
WHERE pubNo = (SELECT pubNo FROM publisher
WHERE pubName = '종로출판사')));
-- 서브 쿼리 결과가 다중 행인 경우에는 = 사용할 경우 오류 발생
SELECT clientName FROM client
WHERE clientNo = (SELECT clientNo FROM bookSale
WHERE bookNo = (SELECT bookNo FROM book
WHERE pubNo = (SELECT pubNo FROM publisher
WHERE pubName = '종로출판사')));
-- 3. 베컴이 주문한 도서의 최고 주문수량 보다 더 많은 도서를 구매한 고객명 출력
SELECT clientName FROM client
WHERE clientNo IN (SELECT clientNo FROM bookSale
WHERE bsQty > ALL (SELECT bsQty FROM bookSale
WHERE clientNo IN (SELECT clientNo FROM client
WHERE clientName = '베컴')));
-- 또는
SELECT clientName FROM client
WHERE clientNo IN (SELECT clientNo FROM bookSale
WHERE bsQty > ALL (SELECT bsQty FROM bookSale
WHERE clientNo = (SELECT clientNo FROM client
WHERE clientName = '베컴')));
-- 또는 ( MAX() 사용 )
SELECT clientName FROM client
WHERE clientNo IN (SELECT clientNo FROM bookSale
WHERE bsQty > (SELECT MAX(bsQty) FROM bookSale
WHERE clientNo IN (SELECT clientNo FROM client
WHERE clientName = '베컴')));
-- 4. 서울에 거주하는 고객에게 판매한 도서의 총 판매량 출력
-- IN 사용
SELECT SUM(bsQty) AS "총 판매량" FROM bookSale
WHERE clientNo IN (SELECT clientNo FROM client
WHERE clientAddress LIKE '%서울%');
-- EXISTS 사용 (결과 동일)
SELECT SUM(bsQty) AS "총 판매량" FROM bookSale
WHERE EXISTS (SELECT clientNo FROM client
WHERE clientAddress LIKE '%서울%' AND client.clientNo = bookSale.clientNo);
-- 서울에 거주하는 고객에게 판매한 도서의 판매량
-- JOIN으로 확인
SELECT C.clientNo, C.clientAddress, BS.bsQty
FROM client C INNER JOIN bookSale BS ON C.clientNo = BS.clientNo
WHERE C.clientAddress LIKE '%서울%';