CodeGym /행동 /SQL SELF /DISTINCT로 유니크 값 뽑아내기

DISTINCT로 유니크 값 뽑아내기

SQL SELF
레벨 6, 레슨 1
사용 가능

가끔 데이터베이스는 기억력이 안 좋은 사람 같아 — 다 적어놓긴 하는데, 이미 적은 걸 또 적는 거지. 그래서 고객 도시 테이블을 열어보면 "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에 쓸데없는 부담만 줄 뿐이야.

2
과제
SQL SELF, 레벨 6, 레슨 1
잠금
고객의 유니크한 도시
고객의 유니크한 도시
2
과제
SQL SELF, 레벨 6, 레슨 1
잠금
이름과 성의 유니크한 조합
이름과 성의 유니크한 조합
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION