서브 쿼리
- 하나의 SQL 문안에 포함되어 있는 또 다른 SQL 문을 말함
- 반드시 괄호로 묶어야 함
서브쿼리 사용 가능한 곳
- SELECT 절
- FROM 절
- WHERE 절
- HAVING 절
- ORDER BY 절
- 기타 DML(INSERT, DELETE, UPDATE) 절
※ GROUP BY 절 사용 불가
서브 쿼리 종류
- 동작하는 방식에 따라
- UN-CORRELATED(비연관) 서브쿼리
- 서브쿼리가 메인 쿼리 컬럼을 가지고 있지 않은 형태의 서브쿼리
- 메인 쿼리에 서브 쿼리가 실행된 결과 값을 제공하기 위한 목적으로 사용
- CORRELATED(연관) 서브쿼리
- 서브 쿼리가 메인 쿼리 컬럼을 가지고 있는 형태의 서브 쿼리
- 일반적으로 메인 쿼리가 먼저 수행된 후에 서브쿼리에서 조건이 맞는지 확인하고자 할 때 사용
- UN-CORRELATED(비연관) 서브쿼리
- 위치에 따라
- 스칼라 서브 쿼리
- SELECT에 사용하는 서브쿼리
- 서브쿼리 결과를 마치 하나의 컬럼처럼 사용하기 위해 주로 사용
- 인라인 뷰
- FROM 절에 사용하는 서브쿼리
- 서브쿼리 결과를 테이블처럼 사용하기 위해 주로 사용
- WHERE 절 서브쿼리
- 가장 일반적인 서브쿼리
- 비교 상수 자리에 값을 전달하기 위한 목적으로 주로 사용(상수항의 대체)
- 리턴 데이터의 형태에 따라 단일행 서브쿼리, 다중행 서브쿼리, 다중 컬럼 서브쿼리, 상호 연관 서브쿼리로 구분
- 스칼라 서브 쿼리
WHERE절 서브쿼리 종류
- 단일행 서브쿼리
- 서브쿼리 결과가 1개의 행이 리턴되는 형태
- 단일행 서브쿼리 연산자 종류 (=, <>, >, >=, <, <=)
- 다중행 서브쿼리
- 서브쿼리 결과가 여러 행이 리턴되는 형태
- '=', '>', '<'와 같은 비교 연산자 사용 불가(여러 값이랑 비교할 수 없는 연산자들
- 서브쿼리 결과를 하나로 요약하거나 다중행 서브쿼리 연산자를 사용 (IN, > ANY, < ANY, < ALL, >ALL)
- 다중컬럼 서브쿼리
- 서브쿼리 결과가 여러 컬럼이 리턴되는 형태
- 메인 쿼리와의 비교 컬럼이 2개 이상
- 대소 비교 전달 불가(두 값을 동시에 묶어 대소 비교 할 수 없음)
- 상호 연관 서브 쿼리
- 메인 쿼리와 서브쿼리의 비교를 수행하는 형태
- 비교할 집단이나 조건은 서브쿼리에 명시(메인 쿼리 절에는 서브 쿼리 컬럼이 정의되지 않았기 떄문에 에러 발생)
※ 상호 연관 서브 쿼리 연산 순서
- 메인 쿼리 테이블 READ
- 메인 쿼리 WHERE 절 확인
- 서브쿼리 테이블 READ
- 서브쿼리 WHERE 절 확인
- 서브쿼리 WHERE 절 수행
- 조건에 성립하는 행의 그룹 연산 결과 확인
- 결과를 메인 쿼리에 전달하여 해당 조건을 만족하는 행만 추출
※ 상호 연관 서브 쿼리 사용 시 GROUP BY 생략 가능
인라인 뷰(Inline View)
- 쿼리 안의 뷰의 형태로 테이블처럼 조회할 데이터를 정의하기 위해 사용
- 테이블명이 존재하지 않기 때문에 다른 테이블과 조인 시 반드시 테이블 별칭 명시 (단독으로 사용하는 경우 불필요)
- WHERE 절 서브쿼리와 다르게 서브쿼리 결과를 메인 쿼리의 어느 절에서도 사용할 수 있음
- 인라인 뷰의 결과와 메인 쿼리 테이블과 조인할 목적으로 주로 사용
- 모든 연산자 사용 가능
스칼라 서브 쿼리
- SELECT 절에 사용하는 쿼리로, 마치 하나의 컬럼처럼 표현하기 위해 사용 (단, 하나의 출력 대상만 표현 가능)
- 각 행마다 스칼라 서브쿼리 결과가 하나여야 함 (단일행 서브쿼리 형태)
- 조인의 대체 연산
- 스칼라 서브쿼리를 사용한 조인 처리 시 OUTER JOIN이 기본 (값이 없더라도 생략되지 않고, NULL로 출력됨)
서브 쿼리 주의 사항
- 특별한 경우 (TOP-N 분석 등)을 제외하고는 서브 쿼리절에 ORDER BY 절을 사용 불가
- 단일 행 서브쿼리와 다중 행 서브쿼리에 따라 연산자의 선택이 중요
'SQL' 카테고리의 다른 글
SQLD - SQL 활용 (윈도우 함수) (1) | 2024.11.16 |
---|---|
SQLD - SQL 활용 (집합 연산자, 그룹 함수) (2) | 2024.11.16 |
SQLD - 데이터 모델과 SQL(모델이 표현하는 트랜잭션의 이해, Null 속성의 이해, 본질 식별자 VS 인조 식별자) (3) | 2024.11.15 |
SQLD - 데이터 모델과 SQL (관계와 조인의 이해) (1) | 2024.11.15 |
SQLD - 데이터 모델과 SQL (정규화) (3) | 2024.11.15 |