sungyup's.

PostgreSQL / SQL Basics / 1.9 Distinct

1.9Distinct

중복값을 없애는 DISTINCT 키워드

TL;DR

DISTINCT로 중복 없이 고유한 값만 추출하기

데이터를 조회할 때, 중복된 값은 제외하고 고유한 값만 보고 싶을 때가 있다. 이럴 때 DISTINCT 키워드를 사용한다.

DISTINCT의 기본 사용

sql
SELECT DISTINCT department FROM products;

products 테이블에서 중복된 department는 제거하고 고유한 department 값들만 한번씩 나온다.

즉, department가 같은 여러 열이 있더라도 해당 열들은 하나의 department 데이터로 표현된다.

고유한 값의 개수 세기

고유한 값이 몇 개인지 알고 싶다면 COUNT(DISTINCT ...)를 사용한다.

sql
SELECT COUNT(DISTINCT department) FROM products;

DISTINCT vs GROUP BY

둘 다 중복 제거를 하지만, 사용 방식과 목적에 차이가 있다.

항목DISTINCTGROUP BY
의도중복 제거 후 값 목록을 보기 위함특정 기준으로 그룹을 만들고 통계를 내기 위함
간결성짧고 직관적다소 긺
목적고유한 행만 추출그룹별로 묶은 후 집계
형태중복 제거집계 함수와 함께 사용
확장성제한적더 다양하고 유연한 분석 가능

GROUP BYDISTINCT를 대체할 수 있지만, 반대로 DISTINCTGROUP BY를 대체할 수 없다.

여러 컬럼의 고유 조합 추출

DISTINCT로 한 컬럼뿐 아니라 여러 컬럼의 조합이 고유한지도 판단할 수 있다.

sql
SELECT DISTINCT department, name FROM products;
  • departmentname이 같은 행은 하나만 출력된다.
  • 둘 중 하나만 달라도 별도의 행으로 취급된다.

⇒ 단, 이렇게 하면 COUNT 같은 집계 함수(aggregate operator)는 사용이 안 된다.

sql
SELECT DISTINCT department COUNT(*) FROM products; -- 에러 발생
  • 이유: DISTINCT는 단순히 고유한 행을 뽑는데 쓰이고,
  • COUNT(*) 같은 집계 함수는 그룹화된 데이터에만 적용되기 때문이다. ⇒ 이런 경우에는 GROUP BY를 써야 한다.
sql
SELECT department, COUNT(*) FROM products GROUP BY department;