A. 서브쿼리

 

- 서브쿼리 개요

  • 하나의 SQL문안에 포함되어 있는 또 다른 SQL문
  • 서브쿼리는 메인쿼리의 칼럼을 모두 사용할 수 있음
  • 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없음
  • 질의 결과에 서브쿼리 칼럼을 표시해야 한다면 조인 방식으로 변환, 함수, 스칼라 서브쿼리(Scalar Subquery)를 사용
  • 서브쿼리는 서브쿼리 레벨과는 상관없이 항상 메인쿼리 레벨로 결과 집합이 생성

 

- 서브쿼리 주의사항

  • 괄호를 사용하여 서브쿼리 표시
  • 서브쿼리는 단일 행(Single Row)/복수 행(Multiple Row) 비교 연산자와 함께 사용
  • 단일 행 비교 연산자는 서브쿼리의 결과가 1 건 이하
  • 복수 행 비교 연산자는 서브쿼리의 결과 건수와 상관없음
  • 서브쿼리에서는 ORDER BY를 사용하지 못함

 

- 서브쿼리 사용 위치

  • SELECT 절
  • FROM 절
  • WHERE 절
  • HAVING 절
  • ORDER BY 절
  • INSERT문의 VALUE 절
  • UPDATE문의 SET 절
 

 

B. 동작하는 방식에 따른 서브쿼리 분류

 

동작하는 방식에 따른 서브쿼리 분류

 

 

 

 

C. 반환되는 데이터의 형태에 따른 서브쿼리 분류

 

반환되는 데이터의 형태에 따른 서브쿼리 분류

 

 

 

 

D. 단일 행 서브 쿼리

1) 단일 행 비교 연산자(=,〈,<=, >, >=,〈〉)와 함께 사용
2) 결과 건수가 반드시 1 건 이하
3) 메인쿼리는 서브쿼리에서 반환된 결과를 이용

단일 행 서브 쿼리

 

 

E. 다중 행 서브 쿼리

1) 서브쿼리의 결과가 2건 이상
2) 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용

다중 행 서브 쿼리

 

 

F. 다중 컬럼 서브 쿼리

1) 서브쿼리의 결과로 여러 개의 칼럼이 반환되어 메인쿼리의 조건과 동시에 비교
2) SQL Server에서는 지원되지 않는 기능

다중 컬럼 서브 쿼리

 

 

 

G. 연관 서브 쿼리

  • 서브쿼리 내에 메인쿼리 칼럼이 사용된 서브쿼리
  • 메인쿼리에 존재하는 모든 행에 대해서 반복 수행
  • EXISTS 서브쿼리는 항상 연관 서브쿼리로 사용
  • EXISTS 서브쿼리는 조건을 만족하는 건이 많아도 조건을 만족하는 1건만 찾으면 검색을 진행하지 않음

연관 서브 쿼리

 

 

 

 

H. 기타 서브 쿼리

 

- SELECT 절에 서브쿼리

1. 스칼라 서브쿼리(Scalar Subquery)
2. 한 행,한 칼럼(1 Row 1 Column)만을 반환
3. 메인쿼리의 결과 건수만큼 반복수행

SELECT 절에 서브쿼리

 

 

- FROM 절에 서브쿼리

1. 인라인 뷰(Inline View)
2. 동적으로 생성된 테이블인 것처럼 사용
3. 인라인 뷰에서는 ORDER BY절 사용 가능

 

 

- FROM 절에 서브쿼리 : TOP-N 쿼리

1. 인라인 뷰에 먼저 정렬을 수행하고 일부 데이터를 추출하는 것
2. 정렬 결과 중 일부 데이터만을 추출할 수 있는 방법이 필요
3. Oracle은 ROWNUM 연산자를 사용하여 TOP-N 쿼리를 구현
4. SQL Server은 TOP 연산자를 사용하여 TOP-N 쿼리를 구현

 

스칼라 서브 쿼리 예시

 

 

 

I. 뷰 (VIEW)

  • 뷰(View)는 데이터 없는 가상 테이블(Virtual Table)
  • 뷰 정의(View Definition)로 구현
  • 뷰 정의 질의를 재작성(Rewrite)하여 쿼리 수행
  • 존재하는 뷰를 참조해서도 신규 뷰 생성 가능
  • 뷰를 포함하는 뷰를 잘못 생성하는 경우 성능 문제가 발생할 수 있음
  • CREATE VIEW문을 통해서 생성
  • DROP VIEW문으로 삭제

뷰(VIEW)의 장점