- 하나의 SQL문 안에 포함된 또다른 SQL(SELECT)문
- 메인쿼리(기존쿼리)를 위해 보조 역할을 하는 쿼리문
-- SELECT, FROM, WHERE, HAVGIN 절에서 사용가능
단일행 (단일열) 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 1개일 때
-> 조회 결과가 1행1열
다중행 (단일열) 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 여러개일 때
-> 행은 여러개 컬럼은 1개
(단일행) 다중열 서브쿼리 (단일행 = 결과값은 한 행)
서브쿼리 SELECT 절에 나열된 컬럼 수가 여러개 일 때
-> 컬럼이 여러개, 행은 1개
다중행 다중열 서브쿼리 : 서브쿼리 조회 결과 행 수와 열 수가 여러개 일 때
-> 행도 여러개 컬럼도 여러개
상관 서브쿼리 : 서브쿼리가 만든 결과 값을 메인 쿼리가 비교 연산할 때
메인 쿼리 테이블의 값이 변경되면 서브쿼리의 결과값도 바뀌는 서브쿼리
--> 메인이 먼저, 서브가 나중에 해석된다.
스칼라 서브쿼리 : 상관 쿼리이면서 결과 값이 하나인 서브쿼리
서브쿼리 유형에 따라 서브쿼리 앞에 붙은 연산자가 다름
서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리
단일행 서브쿼리 앞에는 비교 연산자 사용
<, >, <=, >=, =, !=, ^=, <>
서브쿼리의 조회 결과 값의 개수가 여러행일 때
IN / NOT IN : 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면
혹은 없다면 이라는 의미(가장 많이 사용!)
> ANY, < ANY : 여러개의 결과값 중에서 한개라도 큰 / 작은 경우
가장 작은 값보다 큰가? / 가장 큰 값 보다 작은가?
> ALL, < ALL : 여러개의 결과값의 모든 값보다 큰 / 작은 경우
가장 큰 값 보다 큰가? / 가장 작은 값 보다 작은가?
EXISTS / NOT EXISTS : 값이 존재하는가? / 존재하지 않는가?
WHERE절에 작성된 컬럼 순서에 맞게
서브쿼리의 조회된 컬럼과 비교하여 일치하는 행만 조회
(컬럼 순서가 중요!)
집합연산자 중 선택함수(DECODE or CASE문) 사용!
DECODE(컬럼명, 값1, 1인경우, 값2, 2인경우,.... 일치하지 않는경우)
CASE WHEN 조건1 THEN 값1
WHEN 조건2 THEN 값2
ELSE 값
END 별칭
쉽긴하지만 정렬을 하려고하면 RESULT SET을 SELECT하는 구문이 또 필요함