3일차

고규빈·2021년 12월 15일
0

서브쿼리

부속질의(subquery)란? - 하나의 SQL 문 안에 다른 SQL 문이 중첩된(nested) 질의를 말함.

  • 다른 테이블(서브쿼리)에서 가져온 데이터로 현재 테이블(메인쿼리)에 있는 정보를 찾거나
    가공할 때 사용함.
  • 보통 데이터가 대량일 때 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서
    공급해주는 부속질의가 성능이 더 좋음.
  • 주 질의(main query, 외부질의)와 부속질의(sub query, 내부질의)로 구성됨

*부속질의 라는 말 거의 안씀.

그냥 쿼리로 조건 다 못쓰는거 서브쿼리로 추가하는거 같다.

상관 서브쿼리 어렵다 ㅠㅠ


서브 쿼리 종류

오늘의 예제

--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);

profile
안녕하세요

0개의 댓글