본문으로 건너뛰기
실습하기

중첩 집계와 DISTINCT

집계 함수와 DISTINCT

DISTINCT를 집계 함수 안에서 사용하면, 중복을 제거한 뒤 계산할 수 있습니다.

지역별 고유 고객 수 세기
SELECT COUNT(DISTINCT client_id)
FROM client_orders;

위 쿼리는 중복된 고객을 제외한 주문 고객 수를 반환합니다.

아래는 AVG()DISTINCT를 함께 사용하는 예시입니다.

고유한 주문 금액의 평균
SELECT AVG(DISTINCT order_total)
FROM client_orders;

이 쿼리는 중복되는 주문 금액을 제외하고 고유한 주문 금액만으로 평균을 계산합니다.

AVG(DISTINCT column)은 중복 값을 제거한 뒤 평균을 구하기 때문에, 단순 AVG(column)과 결과가 다를 수 있습니다.


DISTINCT와 UNIQUE의 차이

DISTINCTUNIQUE는 비슷해 보이지만 쓰임새가 다릅니다.

  • SELECT 절:

    • DISTINCT: 표준 SQL 문법, 대부분의 DBMS에서 지원
    • UNIQUE: 일부 데이터베이스에서만 지원되는 비표준 동의어
  • CREATE TABLE:

    • UNIQUE: 제약 조건만 사용 가능
    • 중복을 허용하지 않도록 컬럼 제약을 설정할 때 활용

중첩 집계(서브쿼리)

서브쿼리(Subquery)는 다른 쿼리 안에 포함된 쿼리로, 이미 집계된 결과를 다시 요약할 때 사용됩니다.

예를 들어, 시도(지역)별 평균 주문 금액을 계산한 뒤, 그중 가장 높은 평균값을 찾는 예시는 다음과 같습니다.

평균 주문 금액이 가장 높은 시도 찾기
SELECT MAX(avg_total)
FROM (
SELECT region, AVG(order_total) AS avg_total
FROM clients
JOIN client_orders ON clients.id = client_orders.client_id
GROUP BY region
) AS region_averages;
  • 내부 쿼리: 지역별 평균 주문 금액을 계산
  • 외부 쿼리: 내부 쿼리 결과에서 가장 높은 평균값을 선택

서브쿼리를 활용하면, 단일 집계로는 표현하기 어려운 다단계 요약을 손쉽게 수행할 수 있습니다.

다음 내용이 궁금하다면?

코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!