데이터베이스/데이터베이스 공부

서브쿼리(비연관/연관 서브쿼리, 스칼라 서브쿼리, 인라인 뷰 서브쿼리, 중첩 서브쿼리, 단일 행 서브쿼리, 다중 행 서브쿼리, 다중 칼럼 서브쿼리)

아밍나 2022. 8. 28. 22:40
728x90

서브쿼리

하나의 SQL문에 포함된 또 하나의 SQL문.

  알려지지 않은 기준을 이용한 검색을 위해 사용.

 

- 메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계.

→ 서브쿼리는 메인쿼리의 칼럼을 모두 사용할 수 있지만, 메인 쿼리는 서브 쿼리의 칼럼을 사용할 수 없다.

 


서브쿼리 주의사항

① 서브쿼리를 괄호로 감싸서 사용한다.

 

② 서브쿼리는 단일 행(Single Row) 또는 복수 행(Multiple Row) 비교 연산자와 함께 사용 가능하다.

→ 단일 행 비교연산자는 서브 쿼리의 결과가 반드시 1건 이하.

→ 복수 행 비교연산자는 서브 쿼리의 결과 건수와 상관 없음.

 

③ 서브쿼리에서는 ORDER BY를 사용하지 못한다.

ORDER BY절은 SELECT 절에서 오직 한 개만 올 수 있기 때문에 메인쿼리의 마지막 문장에 위치해야 한다.


서브쿼리 종류

종류 설명
Un-Correlated(비연관) 서브쿼리 서브쿼리가 메인쿼리 칼럼을 가지고 있지 않은 형태.
메인 쿼리에 서브쿼리가 실행된 결과 값을 제공하기 위한 목적으로 사용.
Correlated(연관) 서브쿼리 서브쿼리가 메인쿼리 칼럼을 가지고 있는 형태.
메인쿼리가 수행된 후 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고 할 때 사용.

서브쿼리 사용 가능한 위치

- SELECT 절
- FROM 절
- WHERE 절
- HAVING 절
- ORDER BY 절
- INSERT 문 VALUES 절
- UPDATE 문 SET 절

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

1) 단일 행(Single Row) 서브쿼리

서브쿼리의 실행 결과가 항상 1건 이하.

→ 메인 쿼리에서 단일 행 비교 연산자(=, <, <=, >, >=, <>)를 통해 쿼리 수행.

테이블 전체에 하나의 그룹함수를 적용할 때는 그 결과값이 1건 생성되기 때문에 단일 행 서브쿼리로 사용 가능.

 

2) 다중 행(Multi Row) 서브쿼리

서브쿼리의 실행 결과가 여러 건.

메인 쿼리에서 다중 행 비교 연산자(IN, ALL, ANY, SOME)를 통해 쿼리 수행.

 

↓ 다중행 비교 연산자 

- IN (서브쿼리)
  : 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건.
(메인쿼리의 비교조건이 서브쿼리의 결과중에서 하나라도 일치하면 참.)

- 비교연산자 ALL (서브쿼리)
  : 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건.
   → '>'를 사용했다면 메인쿼리는 서브쿼리의 모든 결과값을 만족해야하므로, 서브쿼리 결과의 최대값보다 큰 모든 건이 조건을 만족.
 
- 비교연산자 ANY (서브쿼리)
  : 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건.
   → '>'를 사용했다면 메인쿼리는 서브쿼리의 값들 중 어떤 값이라도 만족하면 되므로, 서브쿼리 결과의 최소값보다 작은 모든 건이 조건을 만족.

- EXISTS (서브쿼리)
  : 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건.
  → EXISTS 서브쿼리는 항상 연관 서브쿼리로 사용된다.
  → 조건을 만족하는 건이 여러 건이더라도 조건을 만족하는 1건만 찾으면 추가적인 검색을 진행하지 않는다.

 

3) 다중 칼럼(Multi Column) 서브쿼리

서브쿼리의 실행 결과로 여러 칼럼 반환.

→ 메인쿼리의 조건과 여러 칼럼을 동시에 비교

서브쿼리와 메인쿼리에서 비교하고자 하는 칼럼 개수와 위치가 동일해야 한다.


그 밖의 위치에서 사용하는 서브쿼리

1) SELECT (스칼라 서브쿼리)

한 칼럼, 한 행(1 Column 1 Row)만을 반환.

→ 서브쿼리에서 끝마친 값 하나를 SELECT 함.

단일 행 서브쿼리.

→ 칼럼을 쓸 수 있는 대부분의 곳에서 사용 가능.


2) FROM (인라인 뷰 서브쿼리)

SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰. (Dynamic View)

데이터베이스에 해당 정보가 저장되지 않음. (임시 뷰, 임시 테이블)

서브쿼리를 끝마친 테이블 하나를 FROM 에서 테이블로 잡음.

→ 테이블 명이 올 수 있는 곳에서 사용 가능.

 

- 서브쿼리의 칼럼은 메인쿼리에서 사용할 수 없으나, 인라인 뷰는 동적으로 생성된 테이블이기 때문에 SQL문에서 자유롭게 참조할 수 있다.

 인라인 뷰를 사용하는 것은 JOIN 방식을 사용하는 것과 같다.

 

- 인라인 뷰에서는 ORDER BY 절을 사용할 수 있다.

 

TOP-N 쿼리

인라인 뷰에 먼저 정렬을 수행하고 정렬된 결과 중에서 일부 데이터를 추출하는 것.

TOP-N 쿼리를 수행하기 위해서는 정렬 작업, 정렬 결과 중 일부 데이터만 추출할 수 있는 방법이 필요.

→ Oracle의 ROWNUM (추출하고자 하는 데이터 건수 제약)

SELECT ...
FROM (SELECT ...
      FROM
      WHERE
      ORDER BY )
WHERE ROWNUM <= 5;

3) HAVING (중첩 서브쿼리)

그룹함수와 함께 사용될 때 Grouping 된 결과에 대해 부가적인 조건을 주기 위해 사용.

728x90
반응형