MySQL에서는 DISTINCT와 COUNT를 하나의 쿼리 안에서 함께 사용할 수 있습니다. 이 두 함수를 조합하면 중복된 값을 제거한 상태에서 고유한 값의 개수를 손쉽게 계산할 수 있습니다.
이 글에서는 실제 예제를 통해 테이블 생성부터 데이터 삽입, 그리고 COUNT(DISTINCT ...)를 활용한 고유 값 집계 방법까지 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 CREATE 명령어를 사용하여 테이블을 생성합니다.
mysql> create table DistCountDemo
-> (
-> id int,
-> name varchar(100),
-> age int
-> );
Query OK, 0 rows affected (0.48 sec)
위 쿼리는 학생의 id, name(이름), age(나이) 세 개의 컬럼으로 구성된 DistCountDemo 테이블을 만듭니다.
2. 데이터 삽입하기
INSERT 명령어를 사용하여 샘플 레코드를 삽입합니다. 이때 의도적으로 동일한 이름과 나이를 가진 데이터를 포함시켜 중복 값을 만들어 두었습니다.
mysql> insert into DistCountDemo values(1,'John',23);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DistCountDemo values(2,'Bob',24);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DistCountDemo values(3,'John',23);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DistCountDemo values(4,'Carol',23);
Query OK, 1 row affected (0.20 sec)
3. 전체 레코드 확인하기
SELECT 문을 사용하여 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DistCountDemo;
실행 결과는 다음과 같습니다.
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | John | 23 |
| 2 | Bob | 24 |
| 3 | John | 23 |
| 4 | Carol | 23 |
+------+-------+------+
4 rows in set (0.00 sec)
총 4개의 레코드가 있으며, 그중 'John'이라는 이름이 두 번 등록되어 있는 것을 확인할 수 있습니다.
4. DISTINCT와 COUNT 함께 사용하기
이제 COUNT(DISTINCT name)을 적용하여 나이가 23살인 학생들 중 중복을 제거한 고유한 이름의 개수를 구해 보겠습니다.
mysql> SELECT COUNT(DISTINCT name) from DistCountDemo WHERE age=23;
실행 결과는 다음과 같습니다.
+----------------------+
| COUNT(DISTINCT name) |
+----------------------+
| 2 |
+----------------------+
1 row in set (0.05 sec)
결과 분석
나이가 23살인 레코드는 총 3개(id 1, 3, 4)이지만, 이름 기준으로 보면 'John'이 중복되므로 고유한 이름은 'John'과 'Carol' 두 개뿐입니다. 따라서 결과값은 2가 반환됩니다.
만약 DISTINCT 없이 단순히 COUNT(name)을 사용했다면 중복을 포함한 3이 반환되었을 것입니다. 이처럼 COUNT(DISTINCT 컬럼명) 패턴은 특정 조건에 해당하는 데이터에서 고유한 값의 개수를 세야 할 때 매우 유용하게 활용됩니다.