부속질의(subquery)란? - 하나의 SQL 문 안에 다른 SQL 문이 중첩된(nested) 질의를 말함.
*부속질의 라는 말 거의 안씀.
그냥 쿼리로 조건 다 못쓰는거 서브쿼리로 추가하는거 같다.
상관 서브쿼리 어렵다 ㅠㅠ
서브 쿼리 종류
--1. 할인을 가장 크게 받은 고객의 이름 조회
SELECT MAX(sale), MAX(name)
FROM (SELECT custid, SUM(b.price - o.saleprice) sale
FROM orders o, book b
WHERE o.bookid = b.bookid
GROUP BY custid) a, customer c
WHERE a.custid = c.custid;
--------------------------------- 최종풀이
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(b1.price - o1.saleprice))
FROM book b1, orders o1
WHERE b1.bookid = o1.bookid
GROUP BY o1.custid);
--2. 도서의 주문 금액 중 총 주문금액(saleprice) 평균 이하인 도서의 책이름, 출판사 조회
SELECT b.bookname, b.publisher, o.saleprice
FROM orders o, book b
WHERE o.bookid = b.bookid
AND saleprice <= (SELECT AVG(o.saleprice)
FROM orders o, book b
WHERE o.bookid = b.bookid);
--3. 책이름이 가장 긴 책의 책번호, 책이름, 출판사 조회
SELECT bookid, bookname, publisher
FROM book
WHERE LENGTH(bookname) =(SELECT MAX(LENGTH(bookname)) FROM book);
--4. 주문날짜별로 주문금액의 평균보다 큰 책번호, 책이름, 출판사, 책가격 조회
SELECT orderdate, AVG(saleprice)
FROM orders
GROUP BY orderdate;
SELECT b.bookid, b.bookname, b.publisher, b.price, o1.orderdate
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
GROUP BY bookid);
SELECT bookname "이름"
FROM book
UNION
SELECT name
FROM customer;
--6. 대한민국에 사는 사람이 가장 많이 구매한 책의 이름, 출판사 조회
SELECT a.bookname, a.publisher
FROM(SELECT MAX(b.bookid), MAX(b.bookname) bookname, MAX(b.publisher) publisher, MAX(b.price) price, COUNT() order_cnt
FROM customer c, orders o, book b
WHERE c.custid = o.custid
AND o.bookid = b.bookid
AND c.address LIKE '%대한민국%'
GROUP BY b.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);