서브쿼리는 SELECT 명령에 의한 데이터 질의로, 상부가 아닌 하부의 부수적인 질의를 의미한다.
SELECT 절, FROM 절, WHERE 절 등에 사용할 수 있는데, 주로 WHERE 절에서 사용된다.
JOIN과 마찬가지로 마당 서점 데이터를 활용했다.
SELECT 명령이 하나의 값만 반환하는 것을 '스칼라 값을 반환한다'라고 한다. = 연산자를 사용해 비교할 경우에는 스칼라 값끼리 비교할 필요가 있다.
스칼라 서브쿼리라고 부르기도 한다.SELECT 절, SET 절에서 서브쿼리를 사용할 때는 하나의 값만 반환하는 스칼라 서브쿼리를 사용해야만 한다.SELECT bookname FROM book WHERE price = (SELECT MAX(price) FROM book);![]()
- ⚠️
- book 테이블에서 그냥 첫 번째 책 제목과 가장 비싼 책 가격이 출력됨
-- 단순하게 이렇게 하면 안 된다! SELECT MAX(price), bookname FROM book;![]()
IN 말고 =를 써줘서 작동되지 않음! 값을 비교하는 게 아니라 값이 있는지 여부니까!SELECT name FROM customer WHERE custid IN (SELECT custid FROM orders WHERE bookid IN (SELECT bookid FROM book WHERE publisher = '대한미디어'));![]()
부모의 명령과 자식인 서브쿼리가 특정한 관계를 맺는 것을 상관 서브쿼리라고 한다. 즉, 상위 질의와 하위 부속질의가 독립적이지 않고 서로 관련을 맺고 있다. 이 때문에 서브쿼리 부분만 따로 떼어내서 실행시킬 수 없다.
예제1. 출판사별로 출판사의 평균 도서 가격보다 비싼 도서를 구하시오.
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);