SUBQUERY란?
- 하나의 SQL문 안에 포함된 또다른 SQL문
- 메인쿼리(기존쿼리)를 위해 보조 역할을 하는 쿼리문
유형
서브쿼리 유형에 따라 서브쿼리 앞에 붙은 연산자가 다름
단일행 서브쿼리
서브쿼리의 조회 결과 값의 개수가 1개일 때
- 단일행 서브쿼리 앞에는 비교 연산자 사용
<, >, <=, >=, =, !=/^=/<>
다중행 서브쿼리
서브쿼리의 조회 결과 값의 개수가 여러개일 때
- 다중행 서브쿼리 앞에는 일반 비교 연산자 사용 불가
IN / NOT IN : 한 개라도 일치하는 값이 있다 / 없다
< ANY, > ANY : 가장 큰 값보다 작나? / 가장 작은 값보다 큰가?
< ALL, > ALL : 가장 작은 값보다 작나? / 가장 큰 값보다 큰가?
EXISTS / NOT EXISTS 값이 존재하나? / 값이 존재하지 않나?
다중열 서브쿼리
서브쿼리의 SELECT 절에 자열된 항목수가 여러개 일 때 (행은 단일 행 = 결과 값은 하나)
(컬럼명, 컬럼명, ...) 비교연산자 (서브쿼리)
다중행 다중열 서브쿼리
조회 결과 행 수와 열 수가 여러개일 때
(컬럼명, 컬럼명, ...) 다중행 비교연산자 (서브쿼리)
상관 서브쿼리
서브쿼리가 만든 결과 값을 메인 쿼리가 비교 연산할 때 메인 쿼리 테이블의 값이 변경되면 서브쿼리의 결과값도 바뀌는 서브쿼리
- 상관쿼리는 먼저 메인쿼리 한 행을 조회하고 해당 행이 서브쿼리의 조건을 충족하는지 확인하여 SELECT를 진행함
스칼라 서브쿼리
상관 쿼리이면서 결과 값이 하나인 서브쿼리
인라인 뷰
- FROM절에서 서브쿼리를 사용하는 경우로 서브쿼리가 만든 결과의 집합(RESULT SET)을 테이블 대신에 사용한다.
- FROM절에 이미 정렬된 서브쿼리(인라인 뷰) 적용 시 ROWNUM이 top-N분석에 사용 가능
WITH
- 서브쿼리에 이름을 붙여주고 사용시 이름을 사용하게 함
- 인라인 뷰로 사용될 서브쿼리에 주로 사용됨
- 실행 속도가 빨라진다는 장점이 있음
WITH 서브쿼리명 AS (서브쿼리)
RANK() OVER() / DENSE_RANK() OVER()
RANK() OVER()
- 동일한 순위 이후의 등수를 동일한 인원 수 만큼 건너뛰고 순위 계산
RANK() OVER(ORDER BY 컬럼명 [DESC])
DENSE_RANK() OVER()
- 동일한 순위 이후의 등수를 이후의 순위로 계산
DENSE_RANK() OVER(ORDER BY 컬럼명 [DESC])