본문 바로가기
데이터베이스 DB

서브쿼리 종류

by tovantablack 2024. 12. 17.
728x90
728x90

**서브쿼리(Subquery)**는 SQL에서 하나의 쿼리 내부에 포함된 또 다른 쿼리를 의미합니다. 서브쿼리는 메인 쿼리의 데이터를 필터링하거나 계산하는 데 사용되며, 다양한 형태로 분류됩니다. 다음은 서브쿼리의 주요 종류와 특징입니다:


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

  • 정의: 서브쿼리가 **하나의 행(row)**만 반환하는 서브쿼리입니다.
  • 사용 연산자: =, >, <, >=, <=, <> 등 단일 값과 비교하는 연산자.
  • 예시:
    SELECT EMP_NAME, SALARY
    FROM EMPLOYEES
    WHERE SALARY = (SELECT MAX(SALARY) FROM EMPLOYEES);
    
    • 서브쿼리는 MAX(SALARY)를 계산하여 하나의 값을 반환합니다.

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

  • 정의: 서브쿼리가 **여러 행(rows)**을 반환하는 서브쿼리입니다.
  • 사용 연산자: IN, ANY, ALL, EXISTS 등.
  • 예시:
    SELECT EMP_NAME, SALARY
    FROM EMPLOYEES
    WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS WHERE LOCATION = 'SEOUL');
    
    • 서브쿼리가 여러 DEPARTMENT_ID를 반환하고, 메인 쿼리는 IN 연산을 통해 필터링합니다.

3. 다중 열 서브쿼리 (Multi-Column Subquery)

  • 정의: 서브쿼리가 **여러 열(columns)**을 반환하는 서브쿼리입니다.
  • 사용 연산자: (column1, column2) IN, (column1, column2) = (subquery)
  • 예시:
    SELECT EMP_NAME
    FROM EMPLOYEES
    WHERE (DEPARTMENT_ID, JOB_ID) IN 
          (SELECT DEPARTMENT_ID, JOB_ID 
           FROM JOBS WHERE SALARY > 5000);
    
    • 서브쿼리는 두 개의 열(DEPARTMENT_ID, JOB_ID)을 반환합니다.

4. 상관 서브쿼리 (Correlated Subquery)

  • 정의: 서브쿼리가 메인 쿼리의 값을 참조하는 서브쿼리입니다. 서브쿼리는 메인 쿼리의 각 행에 대해 반복적으로 실행됩니다.
  • 특징: 실행 속도가 느릴 수 있지만 특정 행 기반 연산에 유용합니다.
  • 예시:
    SELECT E1.EMP_NAME, E1.SALARY
    FROM EMPLOYEES E1
    WHERE E1.SALARY > (SELECT AVG(SALARY)
                       FROM EMPLOYEES E2
                       WHERE E2.DEPARTMENT_ID = E1.DEPARTMENT_ID);
    
    • 서브쿼리는 각 E1.DEPARTMENT_ID를 기반으로 평균 급여를 계산합니다.

5. 스칼라 서브쿼리 (Scalar Subquery)

  • 정의: 서브쿼리가 단일 값을 반환하며, SELECT 절에 사용될 수 있는 서브쿼리입니다.
  • 특징: 스칼라 값(단일 값)을 반환하므로 컬럼의 값처럼 사용됩니다.
  • 예시:
    SELECT EMP_NAME, (SELECT MAX(SALARY) FROM EMPLOYEES) AS HIGHEST_SALARY
    FROM EMPLOYEES;
    
    • 서브쿼리가 MAX(SALARY)를 반환하여 각 행에 대해 같은 값을 제공합니다.

6. 중첩 서브쿼리 (Nested Subquery)

  • 정의: 서브쿼리 안에 또 다른 서브쿼리가 포함된 형태입니다.
  • 특징: 여러 레벨의 서브쿼리를 중첩할 수 있습니다.
  • 예시:
    SELECT EMP_NAME
    FROM EMPLOYEES
    WHERE SALARY = (SELECT MAX(SALARY)
                    FROM EMPLOYEES
                    WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                                           FROM DEPARTMENTS
                                           WHERE LOCATION = 'SEOUL'));
    
    • 서브쿼리 안에 또 다른 서브쿼리가 중첩되어 있습니다.

7. 인라인 뷰 (Inline View)

  • 정의: FROM 절에서 서브쿼리를 사용하여 임시 테이블처럼 활용하는 형태입니다.
  • 특징: 결과 집합을 테이블처럼 사용합니다.
  • 예시:
    SELECT DEPARTMENT_ID, AVG_SALARY
    FROM (SELECT DEPARTMENT_ID, AVG(SALARY) AS AVG_SALARY
          FROM EMPLOYEES
          GROUP BY DEPARTMENT_ID)
    WHERE AVG_SALARY > 5000;
    
    • 서브쿼리는 AVG(SALARY)를 계산한 후 메인 쿼리에서 필터링합니다.

8. EXISTS 서브쿼리

  • 정의: 서브쿼리의 결과가 존재하는지 여부를 확인합니다.
  • 사용 연산자: EXISTS, NOT EXISTS.
  • 예시:
    SELECT EMP_NAME
    FROM EMPLOYEES E
    WHERE EXISTS (SELECT 1 
                  FROM DEPARTMENTS D 
                  WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID);
    
    • 서브쿼리의 조건을 만족하는 행이 존재하면 EXISTS는 참으로 평가됩니다.

요약

종류 특징 주요 연산자

단일 행 서브쿼리 하나의 행만 반환 =, >, <
다중 행 서브쿼리 여러 행 반환 IN, ANY, ALL
다중 열 서브쿼리 여러 열 반환 (col1, col2) IN ...
상관 서브쿼리 메인 쿼리의 각 행을 참조하여 실행 메인 쿼리와 상관관계 있음
스칼라 서브쿼리 단일 값을 반환 SELECT 절에 사용
중첩 서브쿼리 서브쿼리 안에 또 다른 서브쿼리가 포함됨 중첩된 서브쿼리 구조
인라인 뷰 FROM 절에서 임시 테이블처럼 사용 FROM 절 사용
EXISTS 서브쿼리 존재 여부에 따라 조건 판단 EXISTS, NOT EXISTS

서브쿼리는 다양한 형태로 사용될 수 있으며, 각 유형은 상황에 따라 성능과 코드 가독성에 영향을 줄 수 있습니다.

728x90
728x90

댓글