Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 고유한 값 조회 후 개수 집계하기 – GROUP BY 활용법

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 BYCOUNT()의 조합을 꼭 익혀두시기 바랍니다.