하나의 쿼리 문장 내에 포함된 또 하나의 쿼리 문장. 비교연산자의 오른쪽에 기술해야 하고 반드시 괄호 안에 넣어야 함. 메인 쿼리가 실행되기 이전에 한 번만 실행된다.


1. SELECT절 서브쿼리(스칼라 서브쿼리)

스칼라 서브쿼리 라고 불리며 SELECT 절 안에 서브쿼리가 들어있다. 이 때, 서브쿼리의 결과는 반드시 단일 행이나 SUM, COUNT 등의 집계함수를 거친 단일 값으로 리턴 되어야 한다. 서브쿼리를 끝마친 값 하나를 메인쿼리에서 SELECT하기 때문이다.

EX)

SELECT 학생이름,
	(SELECT 학과, 학과이름
			FROM 학과
			WHERE 학과, 학과ID = 학생, 학생ID) AS 학과이름
	FROM 학생
	WHERE 학생이름 = '홍길동';

2. FROM절 서브쿼리(인라인뷰 서브쿼리)

인라인뷰 라고 불리며 FROM 절 안에 서브쿼리가 들어있다. 이 때 , 서브쿼리의 결과는 반드시 하나의 테이블로 리턴되어야 한다. 서브쿼리를 끝마친 테이블 하나를 메인쿼리의 FROM에서 테이블로 잡기 때문이다.

EX)

SELECT 학생이름, 수학점수
  FROM ( SELECT 학생.학생이름 AS 학생이름,
                과목.과목점수 AS 수학점수
           FROM 학생, 과목
          WHERE 학생.학생이름 = 과목.학생이름
            AND  과목.과목이름 = '수학' ) ;

3. WHERE절 서브쿼리(중첩 서브쿼리)

중첩 서브쿼리 라고 불리며 WHERE 절 안에 서브쿼리가 들어있다. 가장 자주 쓰이는 대중적인 서브쿼리이며 단일행과 복수행 둘 다 리턴이 가능하다. 서브쿼리를 끝마친 값들을 메인쿼리의 조건절을 통해 비교하기 때문이다.

EX)

SELECT *
  FROM 학생
 WHERE 학생.학생이름 IN ( SELECT 과목.학생이름 FROM 과목 WHERE 과목.과목이름 = '수학' ) ;

4. 단일행 서브쿼리

서브쿼리의 수행결과가 오직 하나의 ROW(행)만을 반환한다. 이 하나의 결과를 가지고 메인쿼리는 비교연산자를 통해 쿼리를 수행한다. 비교연산자는 단일행 비교연산자를 사용한다.(>, ≥, <, ≤, =, <>, …)