Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

MySQL DISTINCT와 GROUP BY로 특정 횟수 이상 반복되는 값만 조회하는 방법

MySQL에서 DISTINCTCOUNT, HAVING 절을 함께 사용하면 테이블 내에서 두 번 이상 반복해서 나타나는 값만 손쉽게 추출할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 사용 방법을 단계별로 살펴보겠습니다.

기본 문법

특정 횟수 이상 나타나는 필드 값을 반환하려면 아래와 같은 형식의 쿼리를 사용합니다.

select distinct yourColumnName, count(yourColumnName)
from yourTableName
where yourColumnName LIKE 'J%'
group by yourColumnName
having count(*) > 1
order by yourColumnName;

여기서 핵심은 GROUP BY로 값을 그룹화한 뒤, HAVING 절에서 그룹의 개수 조건을 필터링한다는 점입니다. WHERE 절은 개별 행에 대한 조건이기 때문에 집계 결과에는 사용할 수 없으며, 반드시 HAVING 절을 사용해야 합니다.

예제 테이블 생성하기

1. 테이블 만들기

먼저 실습용 테이블을 생성합니다.

mysql> create table DemoTable1500
    -> (
    -> Name varchar(20)
    -> );
Query OK, 0 rows affected (0.86 sec)

2. 데이터 삽입하기

INSERT 명령으로 몇 개의 레코드를 추가합니다. 일부러 중복되는 이름('John', 'Jace')도 함께 넣습니다.

mysql> insert into DemoTable1500 values('Adam');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1500 values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('Mike');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('Jace');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1500 values('Jace');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1500 values('Jackie');
Query OK, 1 row affected (0.06 sec)

3. 저장된 데이터 확인하기

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

mysql> select * from DemoTable1500;

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

+--------+
| Name   |
+--------+
| Adam   |
| John   |
| Mike   |
| John   |
| Jace   |
| Jace   |
| Jackie |
+--------+
7 rows in set (0.00 sec)

총 7개의 행이 있으며, 'John'과 'Jace'는 각각 2번씩 등장한 것을 확인할 수 있습니다.

두 번 이상 나타나는 값만 조회하는 쿼리

이제 DISTINCT, GROUP BY, HAVING을 조합하여 이름이 'J'로 시작하고 두 번 이상 등장하는 값만 반환하는 쿼리를 실행해 보겠습니다.

mysql> select distinct Name, count(Name)
    -> from DemoTable1500
    -> where Name LIKE 'J%'
    -> group by Name
    -> having count(*) > 1
    -> order by Name;

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

+------+-------------+
| Name | count(Name) |
+------+-------------+
| Jace |           2 |
| John |           2 |
+------+-------------+
2 rows in set (0.00 sec)

결과 분석

  • WHERE Name LIKE 'J%': 이름이 'J'로 시작하는 행만 우선 걸러냅니다. 따라서 'Adam'과 'Mike'는 처음부터 제외됩니다.
  • GROUP BY Name: 남은 값들을 이름 기준으로 그룹화합니다.
  • HAVING count(*) > 1: 그룹 내 행의 수가 2개 이상인 그룹만 남깁니다. 'Jackie'는 한 번만 등장했으므로 여기서 제외됩니다.
  • ORDER BY Name: 최종 결과를 이름 순으로 정렬합니다.

결국 'Jace'와 'John'처럼 정확히 두 번 이상 나타나는 값만 출력되며, 각 값의 등장 횟수까지 함께 확인할 수 있습니다. 이 패턴은 중복 데이터 분석, 통계 집계, 이상치 탐지 등 실무에서 매우 자주 활용되므로 꼭 익혀두시길 권장합니다.