본문 바로가기
SQL/SQL 개념정리

SubQuery, SelfJoin, WindowFunction 비교

by JeoK 2025. 4. 5.

 

하나의 문제를 해결할 때 Subquery, SelfJoin, Window Function은 서로 다른 방식으로 활용될 수 있다.

따라서 각각의 사용 방식을 구분하여 정리해두고자 한다..

 

SubQuery : 쿼리 안에 또 다른 쿼리를 중첩 사용

SELECT ...
FROM table
WHERE column IN (SELECT ... FROM ...)
;

> 특정 조건에 맞는 값 조회, 필터링, 비교, 임시 테이블

 

  • 특정 기준값 만들기(max, min, avg...)
  • 특정 조건을 만족하는 행만 필터링
  • 외부 쿼리와 값을 비교

특징

  • WHERE, FROM, SELECT 절에서 조건 생성
  • 한번만 실행되고, 외부 쿼리에 값을 전달함
  • 결과가 스칼라. 리스트, 테이블 모두 가능
  • 단순하면 빠름, 중첩이 많아지면 느려짐

Self Join : 같은 테이블을 스스로와 조인

SELECT ...
FROM table A
JOIN table B ON A.조건 = B.조건
;

> 테이블에 별칭을 주고, 과거/미래 또는 같은 그룹의 다른 행과 비교

  • 같은 제품의 첫 해 판매량 찾기, 이전 기록 비교
  • 같은 테이블 내에서 전후 비교 (이전 연도 가격보다 상승한 상품)
  • 두 조건을 가진 행 비교 (같은 고객의 다른 주문끼리 비교)

특징 

  • 조건 비교가 핵심
  • 두 테이블이 실제로는 같지만, 의미적으로 분리해 사용

Window Funtion : 그룹 내에서 행 간 계산을 위한 함수

SELECT *,
       ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) AS rank
FROM table
;

 

> 그룹 내 순위, 누적합, 이동평균, 전후 비교 등 계산값을 각 행에 붙일 때 사용

  • 같은 제품의 연도별 누적 판매량 계산
  • 순위 계산 (row_number, rank, dense_rank)
  • 누적합 ( sum(), over(...) )
  • 이전, 이후 행 참조 (lag, lead)
  • 조건 없이 집계값을 각 행에 붙임

특징

  • 각 행에 계산된 컬럼이 붙음, 결과 행 수 변하지 않음
  • 조인을 하지 않고도 비교, 누적 계산 가능
  • 행을 필터링하지 않고 계산 결과를 열로 보여줌

활용 경우

1. 집계 결과 & 원본 데이터 함께 보고 싶음 > SubQuery, Join

- 제품별 판매 연도 계산

- 그 연도에 해당하는 price 등 원본 정보 필요  

→ GROUP BY만으로는 해결 불가 → 서브쿼리 or 조인 필요

2. 특정 조건을 만족하는 행만 원본 테이블에서 추출 > SubQuery, Join

- 각 부서에서 급여가 가장 높은 employee의 name 추출

같은 테이블끼리 비교해야 하므로 셀프 조인이 필요함.

→ 가장 높은 급여 조건을 원본 테이블에 적용하려면 서브쿼리나 조인 필요

3. 비교 대상이 여러 컬럼일 때 > 튜플 단위의 비교 : SubQuery(col1, col2) 

- "100번 제품"의 "2008년"도 정보 추출

→  단일 필드 비교만으로는 정확한 조건 설정이 어려움 → 튜플 비교 필요

4. 하위 그룹 또는특정 조건을 만족하는 집합만 따로 계산하고 싶을 때 > Subquery 

- 매출이 전체 평균보다 높은 제품만 추출

→  AVG()는 전체 평균이므로, 그걸 서브쿼리로 만든 뒤 필터링해야 함

5. 같은 테이블 내 기준행과 비교 (셀프 비교) > Self Join

- 100번 제품이 이전 해보다 가격이 올랐는가?

- 같은 고객의 전날 구매 금액과 비교

→  같은 테이블끼리 비교해야 하므로 셀프 조인이 필요

6. 순위, 누적합, 전후 행 참조 등 정렬 기반의 계산 필요 > Window Function

- 각 고객의 구매 순위

- 이달 누적 매출

- 이전 주문과의 차이

→  ROW_NUMBER(), RANK(), SUM() OVER() 등 윈도우 함수 없이는 처리 불가능


요약

Case Need
집계 + 원본 데이터 같이 보기  서브쿼리, 조인
조건에 맞는 정확한 행 추출 (최대값의 행) 서브쿼리, 조인
여러 컬럼으로 조건을 비교할 필요가 있을 때  서브쿼리(튜플 비교)
전체 평균, 전체 합 등 기준값과 비교 후 필터링 필요할 때 서브쿼리
같은 테이블끼리 조건 비교 셀프 조인
순위, 누적합, 전/후 행 참조 윈도우 함수