본문 바로가기

Database/MySQL

[연습문제] 서브 쿼리

--  서브 쿼리 연습문제

/*
연습문제
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 '%서울%';

'Database > MySQL' 카테고리의 다른 글

[연습문제] JOIN  (0) 2021.11.27
ORDER BY - 한글 영문 숫자 / 영문 한글 숫자 순서로 정렬  (0) 2021.11.27
[연습문제] DML  (0) 2021.11.27
csv 파일 import 시 주의사항  (0) 2021.11.27
[연습문제] DDL_ALTER  (0) 2021.11.27