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

MySQL에서 테이블 열의 중복 값 개수를 세는 방법 (GROUP BY & HAVING)

데이터베이스 작업을 하다 보면 특정 열에 중복된 값이 몇 번씩 나타나는지 확인해야 하는 경우가 자주 있습니다. MySQL에서는 GROUP BY 절과 HAVING 절을 함께 사용하면 손쉽게 중복 값의 개수를 집계할 수 있습니다.

이 글에서는 예제 테이블을 직접 만들고, 실제로 중복 값 개수를 조회하는 전체 과정을 단계별로 살펴보겠습니다.

1단계: 테이블 생성

먼저 예제에 사용할 테이블을 생성합니다. 정수형(int) 데이터를 저장할 Data라는 이름의 열 하나만 가진 간단한 테이블입니다.

mysql> create table DemoTable(
   Data int
);
Query OK, 0 rows affected (0.98 sec)

2단계: 샘플 데이터 삽입

INSERT 명령을 사용하여 테이블에 여러 개의 레코드를 추가합니다. 이때 의도적으로 같은 값을 반복해서 넣어 중복 데이터를 만들어 둡니다.

mysql> insert into DemoTable values(60);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(50);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(60);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(80);
Query OK, 1 row affected (0.15 sec)

3단계: 저장된 데이터 확인

SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다. 총 6개의 행이 있으며, 6040은 각각 두 번씩 등장한 것을 확인할 수 있습니다.

+------+
| Data |
+------+
| 60   |
| 40   |
| 50   |
| 60   |
| 40   |
| 80   |
+------+
6 rows in set (0.00 sec)

4단계: 중복 값 개수 집계 쿼리 실행

이제 열에서 중복된 값의 개수를 세는 핵심 쿼리입니다. GROUP BY로 값을 그룹화한 뒤, HAVING COUNT(Data) > 1 조건을 주어 두 번 이상 나타난 그룹만 필터링합니다.

mysql> select count(*) from DemoTable group by Data having count(Data) > 1;

실행 결과는 다음과 같습니다.

+----------+
| count(*) |
+----------+
| 2        |
| 2        |
+----------+
2 rows in set (0.03 sec)

쿼리 동작 원리 살펴보기

결과를 해석하면 다음과 같습니다.

  • GROUP BY Data: 동일한 값을 가진 행들을 하나의 그룹으로 묶습니다. 즉, 60 / 40 / 50 / 80 네 개의 그룹이 만들어집니다.
  • COUNT(*): 각 그룹에 속한 행의 개수를 반환합니다.
  • HAVING COUNT(Data) > 1: 전체 집계 결과에서 개수가 2 이상인 그룹, 즉 중복이 발생한 값만 남깁니다.

따라서 위 결과의 2, 2는 각각 값 6040이 두 번씩 중복되었다는 의미입니다. 한 번만 등장한 5080은 HAVING 조건에 걸려 결과에서 제외됩니다.

중복 값 자체도 함께 보고 싶다면?

중복 횟수뿐 아니라 어떤 값이 중복되었는지까지 확인하고 싶다면 SELECT 절에 해당 열을 함께 지정하면 됩니다.

mysql> select Data, count(*) as cnt
   from DemoTable
   group by Data
   having cnt > 1;

이렇게 하면 중복된 값과 그 빈도를 한눈에 파악할 수 있어, 데이터 정합성 검사나 중복 데이터 정리 작업에 매우 유용합니다.