두 개 이상의 테이블 다루기 - SUB QUERY

hyeh·2022년 8월 8일
0

SQL 기초

목록 보기
5/9

부속질의(SUB QUERY)

서브쿼리는 SELECT 명령에 의한 데이터 질의로, 상부가 아닌 하부의 부수적인 질의를 의미한다.
SELECT 절, FROM 절, WHERE 절 등에 사용할 수 있는데, 주로 WHERE 절에서 사용된다.

샘플 데이터

JOIN과 마찬가지로 마당 서점 데이터를 활용했다.

WHERE 절 부속질의

SELECT 명령이 하나의 값만 반환하는 것을 '스칼라 값을 반환한다'라고 한다. = 연산자를 사용해 비교할 경우에는 스칼라 값끼리 비교할 필요가 있다.

  • 스칼라 값을 반환하는 서브쿼리를 특별히 스칼라 서브쿼리라고 부르기도 한다.
  • SELECT 절, SET 절에서 서브쿼리를 사용할 때는 하나의 값만 반환하는 스칼라 서브쿼리를 사용해야만 한다.

예제1. 가장 비싼 도서 이름 찾기

  • 실행 순서를 주의할 것!
SELECT bookname
FROM book
WHERE price = (SELECT MAX(price)
				FROM book);
  • ⚠️
  • book 테이블에서 그냥 첫 번째 책 제목과 가장 비싼 책 가격이 출력됨
-- 단순하게 이렇게 하면 안 된다!
SELECT MAX(price), bookname 
FROM book;

예제2. 대한미디어에서 출판한 도서를 구매한 고객의 이름 찾기

  • 1단계 : book 테이블에서 publisher가 ‘대한미디어’인 bookid 찾기
  • 2단계 : orders 테이블에서 bookid가 1단계의 결과와 같은 custid 찾기
  • 3단계 : customer 테이블에서 custid가 2단계의 결과와 같은 name 찾기
  • ⚠️ : 처음에 IN 말고 =를 써줘서 작동되지 않음! 값을 비교하는 게 아니라 값이 있는지 여부니까!
SELECT name
FROM customer
WHERE custid IN (SELECT custid
				FROM orders
                WHERE bookid IN (SELECT bookid
								FROM book
								WHERE publisher = '대한미디어'));

부속질의 실행 순서

  • 위의 예제2의 실행 순서

상관 부속질의(correlated subquery)

부모의 명령과 자식인 서브쿼리가 특정한 관계를 맺는 것을 상관 서브쿼리라고 한다. 즉, 상위 질의와 하위 부속질의가 독립적이지 않고 서로 관련을 맺고 있다. 이 때문에 서브쿼리 부분만 따로 떼어내서 실행시킬 수 없다.

  • 상관 서브쿼리가 아닌 서브쿼리는 단독으로 실행할 수 있다.

예제1. 출판사별로 출판사의 평균 도서 가격보다 비싼 도서를 구하시오.

  • 1단계 : book 테이블에서 price의 평균을 구한다
  • 2단계 : book 테이블에서 price가 1단계의 결과보다 큰 bookname을 구한다
    • 이때! 두 단계에서 사용되는 테이블에 각각 별칭(Alias)를 준다
    • 두 테이블을 일반조인으로 묶고 조인조건으로 publisher를 같다고 준다
    • 그러면 2단계에 해당하는 출판사를 1단계의 테이블로 가져가서 같은 출판사를 가진 price 평균을 구해주게 된다
SELECT b1.bookname
FROM book b1
WHERE b1.price > (SELECT AVG(b2.price)
					FROM book b2
                    WHERE b2.publisher = b1.publisher); -- GROUP BY 역할을 한다
-- 이 부분만 단독으로 실행되지 않는다
(SELECT AVG(b2.price)
					FROM book b2
                    WHERE b2.publisher = b1.publisher)
  • 테이블 실행 순서
    WHERE절에서 연결될 조건을 지정해줄 때 어떻게 작용하는지를 이해해야 된다. 두 테이블의 출판사가 같은 것들을 묶어준다고 우선 생각. b2에서 구한 평균 가격을 b1에서의 가격과 비교할 때 메인과 서브에서 출판사 같은 애들끼리 비교 시키겟다! 라는 프로세스로 진행됐다고 비교관점에서 이해할 것.
  • ⚠️ 나의 오답
 SELECT bookname
 FROM book
 WHERE price > (SELECT AVG(price)
				FROM book
				GROUP BY publisher);
profile
좌충우돌 천방지축 룰루랄라 데이터 공부

0개의 댓글