네, 가능합니다. GROUP BY와 ORDER BY DESC를 함께 사용하면 열에서 반복되는 값의 개수를 손쉽게 집계할 수 있습니다. 이번 글에서는 예제 테이블을 만들고 데이터를 삽입한 뒤, 각 값이 몇 번 반복되는지 확인하고, 가장 많이 반복된 값만 추출하는 방법까지 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> PostMessage varchar(100)
-> );
Query OK, 0 rows affected (0.69 sec)
Id는 자동 증가(AUTO_INCREMENT) 기본 키로 설정했고, 게시 메시지를 저장할 PostMessage 컬럼을 varchar(100) 타입으로 선언했습니다.
2. 데이터 삽입하기
INSERT 명령어를 사용해 여러 개의 레코드를 추가합니다. 일부러 같은 값('Hi', 'Hello', 'Awesome')을 반복해서 넣었습니다.
mysql> insert into DemoTable(PostMessage) values('Hi');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(PostMessage) values('Hello');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(PostMessage) values('Hi');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(PostMessage) values('Awesome');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(PostMessage) values('Hello');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(PostMessage) values('Hi');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(PostMessage) values('Awesome');
Query OK, 1 row affected (0.33 sec)3. 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 봅니다.
mysql> select *from DemoTable;
출력 결과
+----+-------------+
| Id | PostMessage |
+----+-------------+
| 1 | Hi |
| 2 | Hello |
| 3 | Hi |
| 4 | Awesome |
| 5 | Hello |
| 6 | Hi |
| 7 | Awesome |
+----+-------------+
7 rows in set (0.00 sec)
'Hi'가 3번, 'Hello'와 'Awesome'이 각각 2번씩 저장되어 있는 것을 확인할 수 있습니다.
4. 값별 반복 횟수 집계하기
다음은 MySQL에서 각 값이 몇 번 나타나는지 COUNT()로 집계하고, 내림차순으로 정렬해 조회하는 쿼리입니다.
mysql> select PostMessage,count(Id) from DemoTable group by PostMessage
-> order by count(Id) DESC;
출력 결과
+-------------+-----------+
| PostMessage | count(Id) |
+-------------+-----------+
| Hi | 3 |
| Hello | 2 |
| Awesome | 2 |
+-------------+-----------+
3 rows in set (0.00 sec)
GROUP BY가 PostMessage 값을 기준으로 행들을 그룹화하고, COUNT(Id)가 각 그룹의 개수를 계산한 뒤, ORDER BY DESC가 반복 횟수가 많은 순서대로 정렬해 줍니다.
5. 가장 많이 반복된 값만 조회하기
전체 목록이 아니라 반복 횟수가 특정 기준을 넘는 값만 보고 싶다면 HAVING 절을 활용하면 됩니다. 아래 예제는 2회보다 많이 반복된 값만 필터링합니다.
mysql> select PostMessage,count(Id) from DemoTable group by PostMessage having count(Id) > 2;
출력 결과
+-------------+-----------+
| PostMessage | count(Id) |
+-------------+-----------+
| Hi | 3 |
+-------------+-----------+
1 row in set (0.00 sec)
정리
열의 반복 값을 집계할 때는 다음 흐름을 기억하면 좋습니다.
- GROUP BY: 대상 컬럼을 기준으로 행을 그룹화
- COUNT(): 각 그룹의 반복 횟수 계산
- ORDER BY ... DESC: 반복 횟수가 많은 순서대로 정렬
- HAVING: 집계 결과에 조건을 걸어 최빈값 등 원하는 결과만 필터링
WHERE 절은 그룹화 전에 개별 행을 필터링하는 반면, HAVING은 그룹화 후 집계 결과에 조건을 적용한다는 점도 함께 기억해 두시면 유용합니다.