서브 쿼리
- 단일행 또는 복수행 비교 연산자와 함께 사용 가능
- 서브 쿼리에선 ORDER BY를 사용 불가 -> 메인 쿼리의 마지막 부분에만 위치 가능
- 서브쿼리는 메인쿼리의 테이블의 컬럼 사용 가능 ( 메인 쿼리에선 서브 쿼리의 컬럼 사용 불가)
- 서브쿼리가 SQL문에서 사용 가능한 곳 : SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT문의 VALUES절, UPDATE문의 SET절 (DELETE만 안됨)
- 서브쿼리 안에 있는 테이블( = 조인할 테이블 ) 의 기본키가 2개면 WHERE절에서 조인도 기본키 두개 다 해줘야 한다.
Un-Correlated 서브 쿼리 ( 비연관 서브쿼리 )
- 서브쿼리가 메인쿼리 테이블의 컬럼을 갖고 있지 않은 형태 ( 흔히 쓰는 )
- 메인쿼리에 값만 제공하기 위한 목적으로 주로 사용
Correlated 서브쿼리 ( 연관 서브쿼리 )
- 서브쿼리가 메인쿼리 테이블의 컬럼을 갖는 형태
- 메인쿼리가 먼저 수행되어 읽은 데이터를 서브쿼리에서 조건이 맞는지 확인하려 할 때 사용
단일행 서브쿼리
- 서브쿼리의 결과가 항상 1건 이하인 서브쿼리
- 단일행 비교 연산자 ( =, <, > 등 ) 함께 사용
- 다중행 비교 연산자 (IN, EXISTS, ALL, ANY)등도 사용 가능
다중행 서브쿼리
- 실행 결과가 여러개인 서브쿼리
- 다중행 비교 연산자 ( IN, ALL, ANY, SOME, EXISTS) 만 함께 사용
- WHERE ROWNUM = 1 -> 서브쿼리 결과가 중복이 있어서 에러 뜰 경우 중복을 없애고 하나만 가져오게 하는 방법
Multi Column 서브쿼리 ( 다중 컬럼 서브쿼리 )
- 실행 결과로 여러 컬럼을 반환
- 조건절에 여러 컬럼을 동시에 비교 가능
- 서브쿼리와 메인쿼리에서 비교하고자 하는 컬럼의 개수, 위치가 동일해야 함
* 다양한 위치에서 사용하는 서브쿼리 *
SELECT 절에서 사용
- Scalar 서브쿼리 (스칼라 서브쿼리) -> 단일행 연관 서브쿼리
- 스칼라 서브쿼리 대신 JOIN으로 동일한 결과를 추출 가능
FROM 절에서 사용
- 인라인 뷰(INLINE VIEW) -> 서브쿼리로 만든 가상 테이블
- SQL이 실행될 때만 임시적으로 생성되는 동적 뷰 -> DB에 해당 정보 X, 일회성
- 일반 뷰 = 정적 뷰(Static View)라고 함
- 인라인 뷰 = 동적 뷰(Dynamic View)--> FROM절 안에 있는 서브쿼리로 원하는 내용만 추출해서 새로운 테이블을 만드는 개념
WHERE절에서 사용
- 중첩 서브쿼리
- 단일행 중첩 서브쿼리 / 다중행 중첩 서브쿼리로 구분--> 이 서브쿼리의 결과가 1건 나오면 단일행 -> =, >, < 등으로 메인쿼리와 연동
--> 이 서브쿼리의 결과가 2건이상 다중행 -> IN, ANY, ALL 등으로 메인쿼리와 연동 (단일행 비교연산자로 연동하면 에러)
HAVING 절에서 사용
- 그룹함수와 함께 사용될 때, 그룹핑된 결과에 대해 부가 조건을 걸기위해 사용
UPDATE SET절에서 사용
- 서브쿼리를 사용한 변경 작업을 할 때, 서브쿼리의 결과가 NULL을 반환하면 해당 컬럼 결과가 NULL이 될 수 있기 때문에 주의
'SQLD' 카테고리의 다른 글
SQLD 개념정리 (그룹함수) (3) | 2023.11.09 |
---|---|
SQLD 개념정리 (View) (0) | 2023.11.08 |
SQLD 개념정리 (계층형 질의, 셀프조인) (0) | 2023.11.07 |
SQLD 개념정리 (집합 연산자) (0) | 2023.11.07 |
SQLD 개념정리 (GROUP BY, HAVING, ORDER BY, WITH THIS) (1) | 2023.11.06 |