MySQL에서 특정 컬럼의 값을 기준으로 데이터를 그룹화하고, 각 그룹별 개수를 목록 형태로 확인해야 하는 경우가 자주 있습니다. 예를 들어 이름별 등장 횟수를 집계한다거나, 카테고리별 상품 수를 세는 작업이 대표적입니다.
GROUP BY와 ORDER BY를 함께 사용하기
이럴 때는 GROUP BY 절과 ORDER BY 절을 함께 사용하면 됩니다. 기본 문법은 다음과 같습니다.
SELECT yourColumnName, COUNT(*) AS anyAliasName
FROM yourTableName
GROUP BY yourColumnName
ORDER BY yourColumnName;
- GROUP BY: 지정한 컬럼 값이 같은 행들을 하나의 그룹으로 묶습니다.
- COUNT(*): 각 그룹에 속한 행의 개수를 계산합니다.
- ORDER BY: 결과를 원하는 순서(오름차순/내림차순)로 정렬합니다.
예제 테이블 생성하기
실습을 위해 먼저 demo7이라는 테이블을 만들어 보겠습니다. 이 테이블은 자동 증가되는 id와 이름을 저장하는 first_name 두 개의 컬럼으로 구성됩니다.
mysql> CREATE TABLE demo7
-> (
-> id INT NOT NULL AUTO_INCREMENT,
-> first_name VARCHAR(50),
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (1.22 sec)
데이터 삽입하기
INSERT 명령을 사용하여 몇 개의 레코드를 추가합니다. 의도적으로 같은 이름이 여러 번 반복되도록 입력했습니다.
mysql> INSERT INTO demo7(first_name) VALUES('John');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO demo7(first_name) VALUES('David');
Query OK, 1 row affected (0.22 sec)
mysql> INSERT INTO demo7(first_name) VALUES('John');
Query OK, 1 row affected (0.07 sec)
mysql> INSERT INTO demo7(first_name) VALUES('Bob');
Query OK, 1 row affected (0.27 sec)
mysql> INSERT INTO demo7(first_name) VALUES('David');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO demo7(first_name) VALUES('David');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO demo7(first_name) VALUES('John');
Query OK, 1 row affected (0.26 sec)
mysql> INSERT INTO demo7(first_name) VALUES('John');
Query OK, 1 row affected (0.09 sec)저장된 데이터 확인하기
SELECT 문으로 테이블에 저장된 전체 레코드를 조회합니다.
mysql> SELECT * FROM demo7;
실행 결과는 다음과 같습니다. 총 8개의 행이 있으며, John은 4번, David는 3번, Bob은 1번 나타납니다.
+----+------------+
| id | first_name |
+----+------------+
| 1 | John |
| 2 | David |
| 3 | John |
| 4 | Bob |
| 5 | David |
| 6 | David |
| 7 | John |
| 8 | John |
+----+------------+
8 rows in set (0.00 sec)
그룹화 쿼리 실행하기
이제 first_name 컬럼을 기준으로 결과를 그룹화하고, 각 이름별 빈도수를 목록 형태로 출력하는 쿼리입니다. COUNT(*)에 frequency라는 별칭(alias)을 붙여 결과를 더 읽기 쉽게 만들었습니다.
mysql> SELECT first_name, COUNT(*) AS frequency
FROM demo7
GROUP BY first_name
ORDER BY first_name;
실행 결과는 다음과 같습니다. 각 이름이 알파벳 순으로 정렬되어 있고, 옆에 해당 이름의 출현 횟수가 함께 표시됩니다.
+------------+-----------+
| first_name | frequency |
+------------+-----------+
| Bob | 1 |
| David | 3 |
| John | 4 |
+------------+-----------+
3 rows in set (0.00 sec)
정리
이처럼 MySQL에서는 GROUP BY로 데이터를 그룹화하고 COUNT(*)로 그룹별 개수를 집계한 뒤, ORDER BY로 정렬하여 원하는 목록 형태의 결과를 손쉽게 얻을 수 있습니다. 내림차순으로 많이 나타난 항목부터 보고 싶다면 ORDER BY frequency DESC처럼 응용할 수도 있습니다.