MySQL에서 중복된 데이터가 있는 컬럼의 고유(distinct)한 값을 조회하고, 각 값이 몇 번 나타나는지 개수를 집계하려면 GROUP BY 절과 COUNT() 함수를 함께 사용하면 됩니다.
기본 문법
고유한 값을 그룹으로 묶어 개수를 세는 기본 쿼리 구문은 다음과 같습니다.
select yourColumnName, count(*) as anyAliasName
from yourTableName
group by yourColumnName;
여기서 count(*)는 각 그룹에 속한 행의 수를 반환하며, as anyAliasName 부분에는 원하는 별칭(alias)을 지정할 수 있습니다.
예제 테이블 생성하기
문법을 실제로 이해하기 위해 예제 테이블을 먼저 만들어 보겠습니다. 아래 쿼리로 GroupByAndCountDemo 테이블을 생성합니다.
mysql> create table GroupByAndCountDemo
-> (
-> ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientName varchar(100)
-> );
Query OK, 0 rows affected (0.64 sec)
테이블이 정상적으로 생성되었습니다. 이제 insert 명령으로 샘플 데이터를 입력합니다.
샘플 데이터 삽입하기
의도적으로 이름이 중복되도록 여러 건의 레코드를 삽입합니다.
mysql> insert into GroupByAndCountDemo(ClientName) values('John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('Sam');
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('Sam');
Query OK, 1 row affected (0.16 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('John');
Query OK, 1 row affected (0.51 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('John');
Query OK, 1 row affected (0.13 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('Sam');
Query OK, 1 row affected (0.08 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('Sam');
Query OK, 1 row affected (0.47 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('Sam');
Query OK, 1 row affected (0.09 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('John');
Query OK, 1 row affected (0.13 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('John');
Query OK, 1 row affected (0.10 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('David');
Query OK, 1 row affected (0.12 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('Maxwell');
Query OK, 1 row affected (0.17 sec)
mysql> insert into GroupByAndCountDemo(ClientName) values('Maxwell');
Query OK, 1 row affected (0.15 sec)저장된 전체 레코드 확인하기
select 문으로 테이블의 모든 데이터를 조회해 보겠습니다.
mysql> select *from GroupByAndCountDemo;
실행 결과는 다음과 같습니다. 총 16개의 행이 있으며, 같은 이름이 여러 번 반복되어 저장된 것을 확인할 수 있습니다.
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 1 | John |
| 2 | Carol |
| 3 | Sam |
| 4 | Sam |
| 5 | John |
| 6 | John |
| 7 | John |
| 8 | Sam |
| 9 | Sam |
| 10 | Sam |
| 11 | John |
| 12 | John |
| 13 | John |
| 14 | David |
| 15 | Maxwell |
| 16 | Maxwell |
+----------+------------+
16 rows in set (0.00 sec)
GROUP BY로 고유 값 조회 및 개수 집계하기
이제 GROUP BY를 사용해 고유한 이름별로 그룹화하고, 각 그룹의 개수를 집계해 보겠습니다.
mysql> select ClientName, count(*) as TotalCount
-> from GroupByAndCountDemo
-> group by ClientName;
실행 결과는 다음과 같습니다.
+------------+------------+
| ClientName | TotalCount |
+------------+------------+
| John | 7 |
| Carol | 1 |
| Sam | 5 |
| David | 1 |
| Maxwell | 2 |
+------------+------------+
5 rows in set (0.00 sec)
결과를 보면 중복 없이 5개의 고유한 이름만 조회되었고, 각 이름이 등장한 횟수가 함께 집계되었습니다. 즉, John은 7번, Carol은 1번, Sam은 5번, David은 1번, Maxwell은 2번 나타났습니다.
참고: 고유 값의 '개수'만 필요한 경우
그룹별 상세 내역이 아니라 고유한 값이 총 몇 종류인지만 알고 싶다면 COUNT(DISTINCT)를 사용할 수 있습니다.
select count(distinct ClientName) as UniqueNames from GroupByAndCountDemo;
이 쿼리는 위 예제에서 5를 반환합니다. 두 방식의 차이를 정리하면 다음과 같습니다.
- GROUP BY + COUNT(*): 고유한 값 목록과 각 값별 등장 횟수를 모두 확인할 때 사용
- COUNT(DISTINCT 컬럼명): 고유한 값의 총 종류 수만 빠르게 확인할 때 사용
데이터 분석이나 리포트 작성 시 중복 제거와 집계는 매우 자주 사용되는 패턴이므로, GROUP BY와 COUNT()의 조합을 꼭 익혀두시기 바랍니다.