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

MySQL 테이블에서 특정 값이 3개 이상 등장하는 행 개수 세는 방법

MySQL에서 특정 값이 테이블 내에 3회 이상 나타나는 경우를 찾아 그 개수를 계산해야 할 때가 있습니다. 예를 들어 사용자 ID별 데이터가 저장된 테이블에서, 동일한 값이 3번 이상 반복되는 값이 몇 개인지 확인하고 싶다면 GROUP BY와 서브쿼리를 활용하면 간단하게 해결할 수 있습니다.

1. 샘플 테이블 생성

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

mysql> create table DemoTable
-> (
-> UserId int
-> );
Query OK, 0 rows affected (0.48 sec)

2. 레코드 삽입

INSERT 명령을 사용해 여러 개의 레코드를 입력합니다. 의도적으로 일부 값(10, 20)을 반복해서 넣어 테스트 조건을 만들었습니다.

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable values(30);
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.09 sec)

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values(30);
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.19 sec)

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.21 sec)

3. 전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 봅니다.

mysql> select *from DemoTable;

출력 결과

+----------+
| UserId |
+----------+
| 10 |
| 20 |
| 30 |
| 10 |
| 10 |
| 20 |
| 30 |
| 10 |
| 20 |
| 20 |
| 40 |
+----------+
11 rows in set (0.00 sec)

데이터를 보면 값 10은 4번, 값 20은 4번, 값 30은 2번, 값 40은 1번 등장했습니다.

4. 특정 값이 3개 이상인 행 개수 세기

이제 핵심 쿼리입니다. 서브쿼리로 각 UserId별 등장 횟수를 집계한 뒤, 외부 쿼리에서 그 횟수가 3 이상인 경우만 필터링하여 개수를 셉니다.

mysql> select count(*)
-> from (select UserId, count(*) as total
-> from DemoTable group by UserId
-> )tbl
-> where total >=3;

출력 결과

+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.01 sec)

결과 해석

실행 결과로 2가 반환되었습니다. 이는 값 10과 20이 각각 3회 이상 등장했기 때문입니다. 즉, 이 쿼리는 "3번 이상 반복된 고유 값이 몇 개인지"를 계산하는 것입니다.

쿼리 동작 원리 정리

이 쿼리는 두 단계로 동작합니다.

1단계: 내부 서브쿼리 select UserId, count(*) as total from DemoTable group by UserId가 각 UserId별 등장 횟수를 집계합니다. 결과는 10→4, 20→4, 30→2, 40→1입니다.

2단계: 외부 쿼리의 where total >= 3 조건으로 등장 횟수가 3 이상인 행만 남기고, count(*)로 최종 개수를 구합니다.

만약 3개 이상인 값 자체의 목록까지 확인하고 싶다면 다음과 같이 HAVING 절을 사용하는 방법도 있습니다.

mysql> select UserId, count(*) as total
-> from DemoTable
-> group by UserId
-> having total >= 3;

이처럼 GROUP BY와 COUNT, HAVING 또는 서브쿼리를 조합하면 중복 데이터 분석, 빈도 기반 통계 등 다양한 상황에서 유용하게 활용할 수 있습니다.