하나의 쿼리 문장 내에 포함된 또 하나의 쿼리 문장
- 비교연산자의 오른쪽에 기술해야 하고 반드시 괄호 안에 넣어야 함
- 메인쿼리가 실행되기 이전에 한 번만 실행됨
- SELECT 절
- FROM 절
- WHERE 절
- HAVING 절
- ORDER BY 절
- INSERT 문의 VALUSE 절
- UPDATE 문의 SET 절
SELECT 절 안에 서브쿼리가 들어있다.
- 리턴할 수 있는 최대 데이터가 1개이다.
서브쿼리의 결과는 반드시 단일 행이나 SUM, COUNT 등의 집계 함수를 거친 단일 값으로 리턴되어야 한다.
- 찾고자 하는 데이터가 없는 경우 NULL를 반환한다.
- 값에 대한 캐싱이 가능하다.
홍길동 학생의 학과를 조회한다고 가정하면 다음과 같다.
SELECT 학생이름,
(
SELECT 학과.학과이름
FROM 학과
WHERE 학과.학과ID = 학생.학생ID ) AS 학과이름
FROM 학생
WHERE 학생이름 = '홍길동';
FROM 절 안에 서브쿼리가 들어있다.
- 서브쿼리의 결과는 반드시 하나의 테이블로 리턴되어야 한다.
서브쿼리를 끝마친 테이블 하나를 메인쿼리의 FROM 에서 테이블로 잡기 때문.
수학 과목을 수강하는 학생들의 수학점수를 조회한다고 가정하면 다음과 같다.
SELECT 학생이름, 수학점수
FROM (
SELECT 학생.학생이름 AS 학생이름,
과목.수학점수 AS 수학점수
FROM 학생, 과목
WHERE 학생.학생이름 = 과목.학생이름
AND 과목.과목이름 = '수학'
);
WHERE절 안에 서브쿼리가 들어있다.
- 단일행과 복수행 둘 다 리턴이 가능하다.
서브쿼리를 끝마친 값들을 메인쿼리의 조건절을 통해 비교등을 하기 때문.
수학 과목을 수강하는 학생들의 모든 정보를 조회한다고 가정하면 다음과 같다.
SELECT *
FROM 학생
WHERE 학생.학생이름 IN (
SELECT 과목.학생이름
FROM 과목
WHERE 과목.과목이름 = '수학'
);
- 서브쿼리의 수행결과가 오직 하나의 ROW(행)만을 반환한다.
- 이 하나의 결과를 가지고 메인쿼리는 비교연산자를 통해 쿼리를 수행한다.
- 비교연산자는 단일행 비교연산자를 사용한다.
>, >=, <, <=, = ...
사원들의 평균 급여보다 더 많은 급여를 받는 사원을 검색
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (
SELECT AVG(SAL)
FROM EMP
);
- 서브쿼리의 수행결과가 두 건 이상의 데이터를 반환한다.
- 비교연산자는 다중행 비교연산자를 이용한다.
IN, ANY, SOME, ALL, EXISTS
개발1팀 소속 사원 중 급여를 가장 많이 받는 사람의 이름과 급여를 검색
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL ( SELECT SAL
FROM EMP
WHERE DEPTNAME = '개발1' );