테이블에 저장된 특정 레코드가 몇 번 반복되어 나타나는지 확인하고 싶다면, 집계 함수 COUNT()와 GROUP BY 절을 함께 사용하면 됩니다. GROUP BY로 대상 컬럼의 값을 그룹으로 묶은 뒤, 각 그룹에 속한 레코드 수를 COUNT()로 세는 방식입니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
(
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentSubject varchar(40)
);
Query OK, 0 rows affected (5.03 sec)2. 샘플 데이터 삽입
INSERT 문을 사용해 과목명이 중복되는 데이터를 몇 개 넣어 보겠습니다.
mysql> insert into DemoTable(StudentSubject) values('MySQL');
Query OK, 1 row affected (0.78 sec)
mysql> insert into DemoTable(StudentSubject) values('Java');
Query OK, 1 row affected (0.39 sec)
mysql> insert into DemoTable(StudentSubject) values('MySQL');
Query OK, 1 row affected (1.12 sec)
mysql> insert into DemoTable(StudentSubject) values('MongoDB');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable(StudentSubject) values('Java');
Query OK, 1 row affected (0.45 sec)3. 전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-----------+----------------+ | StudentId | StudentSubject | +-----------+----------------+ | 1 | MySQL | | 2 | Java | | 3 | MySQL | | 4 | MongoDB | | 5 | Java | +-----------+----------------+ 5 rows in set (0.00 sec)
4. 중복 발생 횟수 계산 쿼리
아래 쿼리 하나만으로 각 과목별 레코드가 몇 번 등장했는지 한꺼번에 집계할 수 있습니다.
mysql> select StudentSubject,count(StudentId) from DemoTable group by StudentSubject;
실행 결과는 다음과 같습니다.
+----------------+------------------+ | StudentSubject | count(StudentId) | +----------------+------------------+ | MySQL | 2 | | Java | 2 | | MongoDB | 1 | +----------------+------------------+ 3 rows in set (0.00 sec)
결과 해석
출력 결과를 보면 MySQL은 2번, Java는 2번, MongoDB는 1번 등장했습니다. 즉, GROUP BY가 StudentSubject 값을 기준으로 레코드를 묶고, COUNT(StudentId)가 각 그룹의 행 개수를 반환한 것입니다.
응용 팁
집계 결과를 많이 나온 순서대로 정렬하고 싶다면 ORDER BY와 별칭(Alias)을 활용하면 더 읽기 좋은 결과를 얻을 수 있습니다.
mysql> select StudentSubject, count(StudentId) AS cnt
-> from DemoTable
-> group by StudentSubject
-> order by cnt desc;이처럼 COUNT()와 GROUP BY 조합은 로그 분석, 카테고리별 통계, 중복 데이터 점검 등 실무에서 가장 자주 쓰이는 패턴 중 하나이므로 꼭 익혀두는 것이 좋습니다.