PostgreSQL / SQL Basics / 1.9 Distinct
1.9Distinct
중복값을 없애는 DISTINCT 키워드
TL;DR
DISTINCT로 중복 없이 고유한 값만 추출하기
데이터를 조회할 때, 중복된 값은 제외하고 고유한 값만 보고 싶을 때가 있다.
이럴 때 DISTINCT
키워드를 사용한다.
DISTINCT의 기본 사용
sqlSELECT DISTINCT department FROM products;
products
테이블에서 중복된 department는 제거하고 고유한 department 값들만 한번씩 나온다.
즉, department가 같은 여러 열이 있더라도 해당 열들은 하나의 department 데이터로 표현된다.
고유한 값의 개수 세기
고유한 값이 몇 개인지 알고 싶다면 COUNT(DISTINCT ...)
를 사용한다.
sqlSELECT COUNT(DISTINCT department) FROM products;
DISTINCT
vs GROUP BY
둘 다 중복 제거를 하지만, 사용 방식과 목적에 차이가 있다.
항목 | DISTINCT | GROUP BY |
---|---|---|
의도 | 중복 제거 후 값 목록을 보기 위함 | 특정 기준으로 그룹을 만들고 통계를 내기 위함 |
간결성 | 짧고 직관적 | 다소 긺 |
목적 | 고유한 행만 추출 | 그룹별로 묶은 후 집계 |
형태 | 중복 제거 | 집계 함수와 함께 사용 |
확장성 | 제한적 | 더 다양하고 유연한 분석 가능 |
GROUP BY
는 DISTINCT
를 대체할 수 있지만, 반대로 DISTINCT
는 GROUP BY
를 대체할 수 없다.
여러 컬럼의 고유 조합 추출
DISTINCT
로 한 컬럼뿐 아니라 여러 컬럼의 조합이 고유한지도 판단할 수 있다.
sqlSELECT DISTINCT department, name FROM products;
department
와name
이 같은 행은 하나만 출력된다.- 둘 중 하나만 달라도 별도의 행으로 취급된다.
⇒ 단, 이렇게 하면 COUNT
같은 집계 함수(aggregate operator)는 사용이 안 된다.
sqlSELECT DISTINCT department COUNT(*) FROM products; -- 에러 발생
- 이유:
DISTINCT
는 단순히 고유한 행을 뽑는데 쓰이고, COUNT(*)
같은 집계 함수는 그룹화된 데이터에만 적용되기 때문이다. ⇒ 이런 경우에는GROUP BY
를 써야 한다.
sqlSELECT department, COUNT(*) FROM products GROUP BY department;