SQLite | 데이터 조회 | 중복 데이터를 제외하고 조회 (DISTINCT)


테이블에서 데이터를 조회했을 때 동일한 데이터가 포함되어 있는 경우가 있다. DISTINCT를 지정하면 중복된 데이터를 제외하여 조회할 수 있다. 여기에서는 DISTINCT를 사용하여 중복된 데이터를 제외하는 방법에 대해 설명한다.

DISTINCT를 사용한 중복 데이터 제거

SELECT 문을 사용하여 데이터를 조회할 때, 중복된 데이터를 제외하여 데이터를 조회하려면 DISTINCT 키워드를 사용한다. 형식은 다음과 같다.

SELECT DISTINCT 컬럼명, ... FROM 테이블명;

중복 여부의 판단은 데이터 전체가 일치하는지 여부가 아니라, 데이터 중에 SELECT 문으로 조회한 컬럼의 값이 일치하는 데이터가 대상이 된다. 컬럼이 1개이면 그 컬럼의 값이 같은 데이터를 제외되고, 여러 컬럼의 값을 조회하고 있는 경우에는 그 값의 조합이 모두 같은 데이터가 제외된다.

또한 DISTINCT와는 반대로 중복 데이터도 모두 취득하는 경우에는 ALL 키워드를 지정한다. 형식은 다음과 같다.

SELECT ALL 컬럼명, ... FROM 테이블명;

그러나 DISTINCT와 ALL을 지정하지 않은 경우는 ALL이 작성된 경우와 동일하므로, 특별히 지정할 필요가 없다.

그럼 실제로 중복을 제거해 보도록 한다. 먼저 다음과 같이 테이블을 만든다.

create table product (id integer, name text, color text);
sqlite> create table product (id integer, name text, color text);
sqlite> 

INSERT 문을 사용하여 테이블에 데이터를 추가한다.

insert into product values (1, 'Mouse', 'White');
insert into product values (2, 'Pen', 'Green');
insert into product values (3, 'Mouse', 'Black');
insert into product values (4, 'NotePC', 'Black');
insert into product values (5, 'Display', 'Yellow');
insert into product values (6, 'Mouse', 'White');
sqlite> insert into product values (1, 'Mouse', 'White');
sqlite> insert into product values (2, 'Pen', 'Green');
sqlite> insert into product values (3, 'Mouse', 'Black');
sqlite> insert into product values (4, 'NotePC', 'Black');
sqlite> insert into product values (5, 'Display', 'Yellow');
sqlite> insert into product values (6 'Mouse', 'White');
Error: near "'Mouse'": syntax error
sqlite> insert into product values (6, 'Mouse', 'White');
sqlite> 

DISTINCT를 지정하면 어떻게 바뀌는지 확인해 본다. 먼저 product 테이블의 name 컬럼의 값을 중복한 것도 포함하여 조회해 보자.

select name from product;
sqlite> select name from product;
name      
----------
Mouse     
Pen       
Mouse     
NotePC    
Display   
Mouse     
sqlite> 

다음 DISTINCT 키워드를 사용하여 product 테이블의 name 컬럼의 값을 조회한다.

select distinct name from product;
sqlite> select distinct name from product;
name      
----------
Mouse     
Pen       
NotePC    
Display   
sqlite>

name 컬럼의 값 중에 중복된 값을 제외하고 데이터를 조회할 수 있었다.

다음에 동일하게 product 테이블의 color 컬럼의 값을 DISTINCT 키워드를 지정했을 경우와 하지 않은 경우 각각 조회해 본다.

select color from product;
sqlite> select color from product;
color     
----------
White     
Green     
Black     
Black     
Yellow    
White     
sqlite> 
select distinct color from product;
sqlite> select distinct color from product;
color     
----------
White     
Green     
Black     
Yellow    
sqlite> 

DISTINCT를 지정하여 color 컬럼 값 중에 중복된 값을 제외하고 데이터를 조회할 수 있었다.

여러 컬럼을 대상으로 중복 데이터를 제외

여러 컬럼을 대상으로 중복 데이터를 제외하려면 여러 컬럼 값의 조합이 일치하는 데이터를 제외다. 예를 들어 앞에서 사용한 product 테이블에서 name 컬럼과 color 컬럼의 데이터를 조회할 때 중복 데이터를 제외하고 조회하는 경우는 다음과 같이 작성한다.

select distinct name, color from product;
qlite> select distinct name, color from product;
name        color     
----------  ----------
Mouse       White     
Pen         Green     
Mouse       Black     
NotePC      Black     
Display     Yellow    
sqlite> 

각각의 컬럼에 값만 본다면 같은 값이 있지만, 데이터 두 컬럼의 값이 모두 같은 데이터만 제외되었다.