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