SELECT member_id FROM orders;
member_id
---------
1
1
2
1
3
2
같은 회원이 여러 번 주문하면 member_id가 중복으로 나온다. 여기서 "몇 명이 주문했는지"가 궁금한 거라면 중복을 없애야 한다. DISTINCT는 조회 결과에서 중복된 행을 제거한다.
SELECT DISTINCT member_id FROM orders;
member_id
---------
1
2
3
SELECT 바로 뒤에 DISTINCT를 붙이면 된다. 중복된 값은 한 번만 나온다.
DISTINCT는 컬럼 하나가 아니라 행 전체를 기준으로 중복을 판단한다.
SELECT DISTINCT member_id, product_id FROM order_items;
member_id | product_id
----------+-----------
1 | 101
1 | 102
2 | 101
member_id가 같아도 product_id가 다르면 다른 행으로 취급한다. (1, 101)과 (1, 102)는 중복이 아니다.

중복을 제거한 개수를 셀 때 COUNT와 함께 쓴다.
-- 전체 주문 수
SELECT COUNT(*) FROM orders; -- 6
-- 주문한 회원 수 (중복 제거)
SELECT COUNT(DISTINCT member_id) FROM orders; -- 3
COUNT(*)는 행의 총 개수, COUNT(DISTINCT member_id)는 고유한 member_id의 개수다. 둘의 차이를 구분하는 게 중요하다.
중복 제거만 필요하다면 DISTINCT가 간결하다. 그룹별로 집계까지 필요하다면 GROUP BY를 쓴다.
-- 주문한 적 있는 회원 목록 — 둘 다 결과 동일
SELECT DISTINCT member_id FROM orders;
SELECT member_id FROM orders GROUP BY member_id;
단순히 중복만 없앨 때는 DISTINCT, 집계 함수(COUNT, SUM 등)와 함께 쓸 때는 GROUP BY로 구분하면 된다.
DISTINCT는 기능 자체는 단순하다. 단, 데이터가 많을수록 중복 제거 비용이 커지기 때문에 꼭 필요한 상황에서만 쓰는 게 좋다.