SQLD

SQLD 개념정리 (서브 쿼리)

chojdsj 2023. 11. 7. 19:10
728x90

 

 

서브 쿼리

 

 

- 단일행 또는 복수행 비교 연산자와 함께 사용 가능

 

- 서브 쿼리에선 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이 될 수 있기 때문에 주의