중첩 집계와 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의 차이
DISTINCT
와 UNIQUE
는 비슷해 보이지만 쓰임새가 다릅니다.
-
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 강의를 등록해 주세요!