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

중첩 집계와 DISTINCT

SQL에서는 DISTINCT와 집계 함수를 함께 사용할 수 있고, 고급 요약과 비교를 위해 중첩 쿼리(서브쿼리)도 사용할 수 있습니다.


집계 함수와 DISTINCT

COUNT()AVG() 같은 함수 안에서 DISTINCT를 사용하면 중복을 제거할 수 있습니다.

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

COUNT(DISTINCT 고객_id)는 주문을 한 고유 고객의 수를 반환합니다.

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

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

AVG(DISTINCT 주문_총액)는 중복되는 금액을 제외한 고유한 주문 금액만으로 평균을 계산합니다.

AVG(DISTINCT column)AVG(column)과 동일하지 않습니다. 전자는 중복 값을 제외합니다.


DISTINCT와 UNIQUE의 차이는 무엇인가요?

DISTINCTUNIQUE는 거의 동일합니다. 둘 다 결과 집합에서 중복을 제거합니다.

주요 차이점은 다음과 같습니다.

  • SELECT에서: DISTINCT가 SQL 표준입니다. UNIQUE는 일부 시스템에서만 지원되는 비표준 동의어입니다.
  • CREATE TABLE에서: UNIQUE만 유효합니다. 이는 쿼리 수식어가 아니라 제약조건이기 때문입니다.

중첩 집계(서브쿼리)

이미 집계된 결과를 다시 집계해야 할 때는 서브쿼리를 사용합니다.

서브쿼리는 다른 쿼리 안에 포함된 쿼리입니다.

아래는 시도(지역)별 주문 평균값을 구한 뒤, 그중 가장 높은 값을 찾는 예시입니다.

주문 평균값이 가장 높은 시도 찾기
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 강의를 등록해 주세요!