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

MySQL에서 중복 값이 있는 테이블의 최다 발생 항목 조회하기

개요

중복 값이 포함된 테이블에서 가장 자주 나타나는(발생 빈도가 높은) 상위 항목을 조회해야 하는 경우가 종종 있습니다. MySQL에서는 GROUP BY, COUNT(), ORDER BY, LIMIT를 조합하면 이를 간단하게 해결할 수 있습니다. 이번 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.

1. 테이블 생성

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

mysql> create table DemoTable610 (SubjectName varchar(100));
Query OK, 0 rows affected (0.63 sec)

2. 레코드 삽입

insert 명령을 사용해 여러 과목명을 입력합니다. 이때 'MySQL', 'Java', 'MongoDB' 등 일부 값은 의도적으로 중복되어 저장됩니다.

mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable610 values('Java');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable610 values('MongoDB');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable610 values('Java');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable610 values('MongoDB');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable610 values('C');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable610 values('C++');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable610 values('MongoDB');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable610 values('Java');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable610 values('Python');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.15 sec)

3. 전체 데이터 확인

select 문으로 테이블에 저장된 모든 레코드를 확인합니다.

mysql> select *from DemoTable610;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-------------+
| SubjectName |
+-------------+
| MySQL |
| Java |
| MySQL |
| MongoDB |
| MySQL |
| MySQL |
| Java |
| MongoDB |
| C |
| C++ |
| MongoDB |
| MySQL |
| Java |
| Python |
| MySQL |
+-------------+
15 rows in set (0.00 sec)

결과를 보면 총 15개의 레코드 중 'MySQL'이 7번, 'Java'가 4번, 'MongoDB'가 3번 등록되어 있어 중복 값이 다수 존재합니다.

4. 최다 발생 상위 항목 조회 쿼리

다음은 발생 빈도가 가장 높은 상위 2개 항목만 선택하는 쿼리입니다.

mysql> select SubjectName from ( select SubjectName from DemoTable610 group by SubjectName order by count(SubjectName) DESC LIMIT 2 ) AS tbl order by SubjectName;

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

+-------------+
| SubjectName |
+-------------+
| Java |
| MySQL |
+-------------+
2 rows in set (0.04 sec)

쿼리 동작 원리

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

내부 서브쿼리: GROUP BY SubjectName으로 과목명 기준으로 데이터를 그룹화한 뒤, count(SubjectName)을 내림차순(DESC) 정렬하여 빈도가 높은 순서대로 배치합니다. 이후 LIMIT 2를 적용해 최다 발생 상위 2개 항목만 추출합니다.

외부 쿼리: 서브쿼리의 결과를 별칭 tbl로 받아 다시 SubjectName 오름차순으로 정렬합니다. 이렇게 하면 결과를 알파벳 순으로 깔끔하게 확인할 수 있습니다.

마무리

이처럼 GROUP BY와 집계 함수 COUNT(), 그리고 ORDER BY ... DESC LIMIT n을 함께 사용하면 중복 값이 많은 테이블에서도 원하는 개수만큼 최다 발생 항목을 손쉽게 조회할 수 있습니다. 필요에 따라 LIMIT 값을 조정해 상위 5개, 10개 등 원하는 만큼 확장할 수도 있습니다.