2021년 12월 15일 💦비
프롤로그
저한테는 이제 눈으로만 이해되는 식들이 나오기 시작했습니다. 서브쿼리는 우선 이해위주로 하라고 하셔서 이해력을 높이고자 오늘은 문제를 다시 풀어보며 서브쿼리에 대해 정리해보도록 하겠습니다.
서브쿼리 동작 순서
SELECT
FROM - 1
WHERE -2 SELECT - 2-1
FROM - 2-2
1. 나무수 출판사의 책 금액보다 큰 구매금액을 가진 책이름 조회
(단, 나무수 출판사 책 금액 중 가장 큰 금액으로 조회)
SELECT bookname
FROM book
WHERE price > (SELECT MAX(price)
FROM book
WHERE publisher = '나무수');
1. 할인을 가장 크게 받은 고객의 이름 조회
SELECT c.name
FROM book b, orders o, customer c
WHERE b.bookid = o.bookid
AND o.custid = c.custid
GROUP BY c.name
HAVING SUM(b.price - o.saleprice) = (SELECT MAX(SUM(b.price - o.saleprice))
FROM book b1, orders o1
WHERE b1.bookid = o1.bookid
GROUP BY custid);
2. 도서의 주문 금액 중 총 주문금액(saleprice) 평균 이하인 도서의 책이름, 출판사 조회
SELECT b.bookname, b.publisher
FROM orders o, book b
WHERE o.bookid = b.bookid
AND o.saleprice <= (SELECT AVG(o.saleprice)
FROM orders); **
3. 책이름이 가장 긴 책의 책번호, 책이름, 출판사 조회
SELECT bookid, bookname, publisher
FROM book
WHERE LENGTH(bookname) = (SELECT MAX(LENGHTH(bookname))
FROM book);
4. 주문날짜별로 주문금액의 평균보다 큰 책번호, 책이름, 출판사, 책가격 조회
SELECT b.bookid, b.bookname, b.publisher, b.price
FROM orders o1, book b
WHERE o1.bookid = b.bookid
AND saleprice > (SELECT AVG(saleprice)
FROM orders o2
WHERE o2. orderdate = o1.orderdate);
5. 키트리서점 책 중 가장 인기있는 책이름 출력 (주문이 많은 책)
SELECT b.bookname, COUNT()
FROM orders o, book b
WHERE o.bookid = b.bookid
GROUP BY b.bookname
HAVING COUNT() = (SELECT MAX(COUNT(*))
FROM orders o
GROUP BY bookid);
6. 대한민국에 사는 사람이 가장 많이 구매한 책의 이름, 출판사 조회
SELECT a.bookname, a.publisher
FROM (SELECT MAX(b.bookid), MAX(b.bookname) bookname, MAX(b.publisher) publisher, MAX(b.price) price
FROM customer c, orders o, book b
WHERE c. custid = o.custid
AND o.bookid = b.bookid
AND c.address LIKE '%대한민국%'
GROUP BY bookname) a
WHERE order_cnt = (SELECT MAX(COUNT(*))
FROM customer c1, orders o1, book b1
WHERE b1.bookid = o1.bookid
AND c1.custid = o1.custid
AND c1.address LIKE '%대한민국%'
GROUP BY b1.bookid);