가끔 데이터베이스는 기억력이 안 좋은 사람 같아 — 다 적어놓긴 하는데, 이미 적은 걸 또 적는 거지. 그래서 고객 도시 테이블을 열어보면 "Berlin"이 열 번, "Seattle"이 다섯 번, 그리고 다른 중복들도 잔뜩 있어. 이건 여러 고객이 같은 도시를 가질 때 흔히 생기는 일이야. 근데 너도 광고 캠페인을 "Berlin" 열 번 기준으로 짜고 싶진 않잖아? 사실은 한 도시인데 말이지.
중복 없이 유니크한 값만 뽑으려면 DISTINCT라는 편리한 명령어가 있어. 이건 마치 마법 빗자루처럼 한 번 휙 하면 중복된 행을 싹 치워주고 진짜 다른 것만 남겨줘.
DISTINCT는 쿼리 결과에서 유니크한 행만 뽑아낼 수 있게 해줘. 이건 중복 데이터, 예를 들면:
- 주문에서 유니크한 상품들.
- 유니크한 고객 이름들.
- 유니크한 데이터 조합, 예를 들어 "도시 + 나라" 같은 거.
DISTINCT는 어떻게 동작할까?
DISTINCT의 문법은 SQL답게 심플하고 직관적이야:
SELECT DISTINCT 컬럼1, 컬럼2, ...
FROM 테이블;
DISTINCT를 쿼리에 추가하면, 데이터베이스는 결과의 각 행이 유니크하다는 걸 보장해줘.
DISTINCT 사용 예시
클래식한 예시부터 시작해서 DISTINCT가 어떻게 동작하는지 감을 잡아보자.
예시 1: 한 컬럼의 유니크 값
학생 데이터가 담긴 students 테이블이 있다고 해보자:
-- students 테이블
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
학생들이 어느 도시에서 왔는지 알고 싶어. 쿼리를 이렇게 써보자
SELECT city
FROM students;
결과는 이래:
| city |
|---|
| Seattle |
| Toronto |
| Seattle |
| Chicago |
| Seattle |
뭔가 우리가 원한 건 아니지 :(
중복을 없애려면 DISTINCT를 써야 해:
SELECT DISTINCT city
FROM students;
결과:
| city |
|---|
| Seattle |
| Toronto |
| Chicago |
DISTINCT 없이 하면 "Seattle"이 세 번이나 나오는데, 사실 한 번만 있으면 되잖아.
예시 2: 여러 컬럼의 유니크 값
이번엔 "이름 + 성" 조합이 유니크한 걸 뽑고 싶다고 해보자. 학생들 중에 동명이인이나 동성인이 있을 수 있으니까.
아까 그 students 테이블이야:
-- students 테이블
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
쿼리:
SELECT DISTINCT first_name, last_name
FROM students;
결과:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Alex | Lin |
| Anna | Song |
| Nat | Cole |
이렇게 DISTINCT는 필터처럼 동작해: 지정한 모든 컬럼을 다 고려해서, 그 값이 전부 똑같은 행만 중복으로 보고 제외해.
예시 3: 유니크 조합 + 정렬
이번엔 DISTINCT랑 ORDER BY를 같이 써서, 유니크한 값들을 성 기준으로 알파벳 순서로 정렬해보자.
students 테이블은 똑같아:
-- students 테이블
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
쿼리:
SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;
결과:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Nat | Cole |
| Alex | Lin |
| Anna | Song |
중복된 행은 사라지고, 성 기준으로 알파벳 순서로 정렬됐어.
예시 4: 집계 함수에 쓰기
이번엔 DISTINCT를 함수, 예를 들면 COUNT에 써보면 어떨까?
SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;
결과:
| unique_city_count |
|---|
| 3 |
이 쿼리는 유니크한 도시 개수를 반환해. 편하지?
DISTINCT 쓸 때 주의할 점
DISTINCT를 쓸 때 중요한 건, 지정한 모든 컬럼을 기준으로 동작한다는 거야. 쿼리에 컬럼을 더 추가하면 결과가 달라질 수 있어.
예시 5: 왜 컨텍스트가 중요할까?
쿼리에 추가 필드를 넣으면, 행의 유니크함에 영향을 줄 수 있어.
SELECT DISTINCT first_name, city
FROM students;
students 테이블:
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Austin |
| 3 | Anna | Song | Seattle |
| 4 | Otto | Art | Denver |
| 5 | Maria | Chi | Portland |
결과:
| first_name | city |
|---|---|
| Maria | Seattle |
| Alex | Austin |
| Anna | Seattle |
| Otto | Denver |
| Maria | Portland |
이제 "이름 + 도시" 조합이 각각 유니크해. 그러니까 꼭 기억해: 유니크함은 지정한 모든 컬럼을 다 합쳐서 판단하는 거지, 각각 따로 보는 게 아니야.
DISTINCT 쓸 때 흔한 실수
DISTINCT를 쓸 때 가장 흔한 실수 중 하나는 쿼리가 실제로 뭘 하는지 제대로 이해 못하는 거야. 예를 들어, 컬럼을 너무 많이 넣으면, 유니크함이 모든 컬럼 기준이 돼서 기대한 결과랑 완전 다를 수 있어.
예를 들어:
SELECT DISTINCT *
FROM students;
이 경우엔 모든 컬럼을 다 고려하니까, 각 행이 다 유니크하다고 간주돼.
또 다른 실수는 DISTINCT가 필요 없는 곳에 쓰는 거야. 이미 데이터가 유니크하다면(예를 들어, 프라이머리 키인 컬럼), DISTINCT는 DBMS에 쓸데없는 부담만 줄 뿐이야.
GO TO FULL VERSION