데이터베이스에서 selelct 문을 사용하여 검색을 할 경우 반드시 고유한(unique) 값만을 원하는 경우가 있습니다. distinct 키워드를 사용하면 해당하는 컬럼에 동일값을 제외한 값만 가져올 수 있습니다. 이 키워드는 SELECT문의 바로 뒤에 위치시켜 사용합니다. 아래처럼 말이죠.

SELECT DISTINCT colName

# distinct 사용해야할 경우
예를들어 어떤 게시판에 있으며 이 게시판에 글을 쓴 사람이 누구인지 알 경우 우리는 글을 몇번 썼는지 알 필요는 없으므로 작성자의 이름을 단 하나만 불러오면 될 것입니다. 만약 아래와 같이 테이블이 존재하는 경우 예를 들어보겠습니다.


테이블명: freeboared(자유 게시판)
------------------------------------
namescore
------------------------------------
Sam  100
David  50
Sam    40
Joy    100
Sam                  40
------------------------------------

게시판에 글을 작성한 사용자만 알기 위해서라면 굳이 중복된 값을 볼 이유는 없으므로 distinct를 사용해 아래와 같이 코드를 작성합니다.

SELECT DISTINCT name
FROM freeboard;

이를 실행하면 아래와 같은 결과로 중복된 값이없이 고유한 하나의 결과만 가져올 수 있습니다.
(참고로 Null값이 있는 경우 중복된 Null 역시 한 개만 반환하게 됩니다.)


------------------------------------
name
------------------------------------
Sam   
David    
Joy
------------------------------------


! 만약 DISTINCT 키워드를 사용하지 않으면 아래와 같은 결과가 나올 것입니다.


------------------------------------
name
------------------------------------
Sam    
David    
Sam    
Joy
Sam
------------------------------------

위 데이터는 불필요한 중복된 값을 가지고 있습니다. 이처럼 distinct를 사용하면 필요한 고유값을 가진 데이터만 나열됩니다.


# 중복된 컬럼에 사용하는 방법
만약에 컬럼을 여러개 사용하려먼 어떻게할까요? 이 역시 가능한 방법으로 콤마를 구분자로 사용해 여러개 사용하면 됩니다. 단 이 경우에는 각각의 컬럼이 가진 고유한 값이 아니라 컬럼의 조합을 한 뒤에 중복된 값을 가져오게 됩니다. 아래의 예제를 봐주세요.

table : freeboard
===============================
id         name           score          course
===============================
1          Henrick        80                Math
2          Frank            30                Eng
3          Tom              70                Eng
4          Anne             90                Math
5          Tom              70                Math
6          Frank            100             Economy
===============================

SELECT DISTINCT name, score FROM freeboard ORDER BY score

이처럼 DISTINCT를 중복된 컬럼에 사용할 경우 중복 컬럼을 조합하여 고유한가의 여부를 확인하게 됩니다.


만약 각각의 컬럼을 기준으로 고유한 값만 필요하다면 어떻게 할까요? 이때는 GROUP BY를 사용해 쉽게 해결할 수 있습니다.