SQL

SQLD - SQL 활용(서브 쿼리)

taey 2024. 11. 16. 01:48

서브 쿼리

  • 하나의 SQL 문안에 포함되어 있는 또 다른 SQL 문을 말함
  • 반드시 괄호로 묶어야 함

 

서브쿼리 사용 가능한 곳

  1. SELECT 절
  2. FROM 절
  3. WHERE 절
  4. HAVING 절
  5. ORDER BY 절
  6. 기타 DML(INSERT, DELETE, UPDATE) 절

※ GROUP BY 절 사용 불가

 

서브 쿼리 종류

  1. 동작하는 방식에 따라
    1. UN-CORRELATED(비연관) 서브쿼리
      • 서브쿼리가 메인 쿼리 컬럼을 가지고 있지 않은 형태의 서브쿼리
      • 메인 쿼리에 서브 쿼리가 실행된 결과 값을 제공하기 위한 목적으로 사용
    2. CORRELATED(연관) 서브쿼리
      • 서브 쿼리가 메인 쿼리 컬럼을 가지고 있는 형태의 서브 쿼리
      • 일반적으로 메인 쿼리가 먼저 수행된 후에 서브쿼리에서 조건이 맞는지 확인하고자 할 때 사용
  2. 위치에 따라
    1. 스칼라 서브 쿼리
      • SELECT에 사용하는 서브쿼리
      • 서브쿼리 결과를 마치 하나의 컬럼처럼 사용하기 위해 주로 사용
    2. 인라인 뷰
      • FROM 절에 사용하는 서브쿼리
      • 서브쿼리 결과를 테이블처럼 사용하기 위해 주로 사용
    3. WHERE 절 서브쿼리
      • 가장 일반적인 서브쿼리
      • 비교 상수 자리에 값을 전달하기 위한 목적으로 주로 사용(상수항의 대체)
      • 리턴 데이터의 형태에 따라 단일행 서브쿼리, 다중행 서브쿼리, 다중 컬럼 서브쿼리, 상호 연관 서브쿼리로 구분

 

WHERE절 서브쿼리 종류

  1. 단일행 서브쿼리
    • 서브쿼리 결과가 1개의 행이 리턴되는 형태
    • 단일행 서브쿼리 연산자 종류 (=, <>, >, >=, <, <=)
  2. 다중행 서브쿼리
    • 서브쿼리 결과가 여러 행이 리턴되는 형태
    • '=', '>', '<'와 같은 비교 연산자 사용 불가(여러 값이랑 비교할 수 없는 연산자들
    • 서브쿼리 결과를 하나로 요약하거나 다중행 서브쿼리 연산자를 사용 (IN, > ANY, < ANY, < ALL, >ALL)
  3. 다중컬럼 서브쿼리
    • 서브쿼리 결과가 여러 컬럼이 리턴되는 형태
    • 메인 쿼리와의 비교 컬럼이 2개 이상
    • 대소 비교 전달 불가(두 값을 동시에 묶어 대소 비교 할 수 없음)
  4. 상호 연관 서브 쿼리
    • 메인 쿼리와 서브쿼리의 비교를 수행하는 형태
    • 비교할 집단이나 조건은 서브쿼리에 명시(메인 쿼리 절에는 서브 쿼리 컬럼이 정의되지 않았기 떄문에 에러 발생)

※ 상호 연관 서브 쿼리 연산 순서

  1. 메인 쿼리 테이블 READ
  2. 메인 쿼리 WHERE 절 확인
  3. 서브쿼리 테이블 READ
  4. 서브쿼리 WHERE 절 확인
  5. 서브쿼리 WHERE 절 수행
  6. 조건에 성립하는 행의 그룹 연산 결과 확인
  7. 결과를 메인 쿼리에 전달하여 해당 조건을 만족하는 행만 추출

※ 상호 연관 서브 쿼리 사용 시 GROUP BY 생략 가능

 

 

인라인 뷰(Inline View)

  • 쿼리 안의 뷰의 형태로 테이블처럼 조회할 데이터를 정의하기 위해 사용
  • 테이블명이 존재하지 않기 때문에 다른 테이블과 조인 시 반드시 테이블 별칭 명시 (단독으로 사용하는 경우 불필요)
  • WHERE 절 서브쿼리와 다르게 서브쿼리 결과를 메인 쿼리의 어느 절에서도 사용할 수 있음
  • 인라인 뷰의 결과와 메인 쿼리 테이블과 조인할 목적으로 주로 사용
  • 모든 연산자 사용 가능

 

스칼라 서브 쿼리

  • SELECT 절에 사용하는 쿼리로, 마치 하나의 컬럼처럼 표현하기 위해 사용 (단, 하나의 출력 대상만 표현 가능)
  • 각 행마다 스칼라 서브쿼리 결과가 하나여야 함 (단일행 서브쿼리 형태)
  • 조인의 대체 연산
  • 스칼라 서브쿼리를 사용한 조인 처리 시 OUTER JOIN이 기본 (값이 없더라도 생략되지 않고, NULL로 출력됨)

 

서브 쿼리 주의 사항

  • 특별한 경우 (TOP-N 분석 등)을 제외하고는 서브 쿼리절에 ORDER BY 절을 사용 불가
  • 단일 행 서브쿼리와 다중 행 서브쿼리에 따라 연산자의 선택이 중요