MySQL에서 특정 열에 포함된 각 고유(distinct) 값이 몇 번씩 나타나는지 확인해야 하는 경우가 자주 있습니다. 예를 들어, 회원 목록에서 같은 이름이 몇 명 있는지 집계하거나, 주문 데이터에서 상품별 주문 횟수를 파악할 때 유용합니다. 이 글에서는 GROUP BY 절과 COUNT() 함수를 활용해 각 고유 값의 개수를 구하는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 실습에 사용할 테이블을 만들어야 합니다. 테이블 생성에는 CREATE TABLE 명령어를 사용합니다.
mysql> create table DistinctDemo1 - > ( - > id int, - > name varchar(100) - > ); Query OK, 0 rows affected (0.43 sec)
위 쿼리는 정수형 id 컬럼과 최대 100자까지 저장 가능한 문자열 name 컬럼으로 구성된 DistinctDemo1 테이블을 생성합니다.
2. 레코드 삽입하기
테이블이 준비되었으니 이제 샘플 데이터를 삽입해 보겠습니다. 의도적으로 'John'이라는 이름을 세 번 반복해서 넣어 중복 값을 만들었습니다.
mysql> insert into DistinctDemo1 values(1,'John'); Query OK, 1 row affected (0.34 sec) mysql> insert into DistinctDemo1 values(2,'John'); Query OK, 1 row affected (0.20 sec) mysql> insert into DistinctDemo1 values(3,'John'); Query OK, 1 row affected (0.09 sec) mysql> insert into DistinctDemo1 values(4,'Carol'); Query OK, 1 row affected (0.17 sec) mysql> insert into DistinctDemo1 values(5,'David'); Query OK, 1 row affected (0.12 sec)
3. 전체 레코드 조회하기
SELECT 문으로 테이블에 저장된 모든 데이터를 확인합니다.
mysql> select *from DistinctDemo1;
실행 결과는 다음과 같습니다.
+------+-------+ | id | name | +------+-------+ | 1 | John | | 2 | John | | 3 | John | | 4 | Carol | | 5 | David | +------+-------+ 5 rows in set (0.00 sec)
총 5개의 레코드가 있으며, 'John'은 3번, 'Carol'과 'David'는 각각 1번씩 등장한 것을 눈으로 확인할 수 있습니다.
4. GROUP BY와 COUNT로 고유 값 개수 세기
각 이름이 몇 번 등장했는지 집계하려면 GROUP BY 절로 이름별로 그룹화한 뒤, COUNT() 함수로 각 그룹의 행 수를 세면 됩니다. 사용 문법은 다음과 같습니다.
mysql> SELECT name,COUNT(1) as OccurenceValue FROM DistinctDemo1 GROUP BY name ORDER BY OccurenceValue;
실행 결과는 아래와 같습니다.
+-------+----------------+ | name | OccurenceValue | +-------+----------------+ | Carol | 1 | | David | 1 | | John | 3 | +-------+----------------+ 3 rows in set (0.04 sec)
결과를 해석해 보면 다음과 같습니다.
- name: 그룹화된 고유 값(이름)
- OccurenceValue: 해당 이름이 나타난 횟수(COUNT 결과)
'John'은 3번, 'Carol'과 'David'는 각각 1번씩 등장했으며, ORDER BY OccurenceValue 덕분에 개수가 적은 순서대로 정렬되어 출력됩니다.
정리 및 추가 팁
핵심 패턴은 SELECT 컬럼명, COUNT(*) FROM 테이블명 GROUP BY 컬럼명입니다. 몇 가지 응용 방법도 알아두면 좋습니다.
COUNT(1),COUNT(*),COUNT(name)모두 여기서는 동일한 결과를 반환하지만,COUNT(컬럼명)은 NULL 값을 제외하고 계산한다는 차이가 있습니다.- 개수가 많은 순서대로 보고 싶다면
ORDER BY OccurenceValue DESC처럼 내림차순으로 정렬하면 됩니다. - 특정 개수 이상인 그룹만 필터링하려면
HAVING COUNT(1) >= 2조건을 추가할 수 있습니다.
이처럼 GROUP BY와 COUNT 함수만 활용하면 별도의 애플리케이션 로직 없이도 SQL 한 줄로 열의 고유 값 분포를 손쉽게 집계할 수 있습니다.