MySQL에서 COUNT(), SUM(), AVG() 같은 그룹 함수(집계 함수)를 사용할 때, 그룹화되지 않은 일반 컬럼을 함께 조회하려면 반드시 GROUP BY 절을 사용해야 합니다. GROUP BY는 지정한 컬럼 값을 기준으로 행들을 묶어주기 때문에, 각 그룹별로 집계 결과와 해당 그룹의 컬럼 값을 동시에 확인할 수 있습니다.
기본 문법
SELECT group_function1, ..., non-group-column1, ... FROM table_name GROUP BY column_name;
예제
다음은 Student 테이블에서 COUNT(*)와 일반 컬럼인 id, address를 함께 조회한 예입니다.
mysql> Select COUNT(*), id from Student GROUP BY id; +----------+------+ | COUNT(*) | id | +----------+------+ | 1 | 1 | | 1 | 2 | | 1 | 15 | | 1 | 17 | | 1 | 20 | +----------+------+ 5 rows in set (0.00 sec) mysql> Select COUNT(*), address from Student GROUP BY id; +----------+---------+ | COUNT(*) | address | +----------+---------+ | 1 | Delhi | | 1 | Mumbai | | 1 | Delhi | | 1 | Shimla | | 1 | Jaipur | +----------+---------+ 5 rows in set (0.00 sec)
결과 해석
첫 번째 쿼리는 id를 기준으로 그룹화하여 각 학생별 행 수를 집계합니다. 두 번째 쿼리 역시 id를 기준으로 그룹화했지만, 화면에는 address 값이 출력됩니다. 이처럼 GROUP BY 절 뒤에 오는 컬럼은 SELECT 절에 나열된 일반 컬럼과 달라도 무방합니다.
단, 주의할 점이 있습니다. SQL 표준 및 MySQL의 ONLY_FULL_GROUP_BY 모드가 활성화된 환경에서는 SELECT 절에 있는 일반 컬럼이 반드시 GROUP BY 절에 포함되거나, 그룹 내에서 유일한 값을 가지는 컬럼이어야 합니다. 위 예제에서 id가 기본 키로 고유하기 때문에 각 그룹의 address 값이 하나로 결정될 수 있었던 것입니다. 만약 그룹 내 여러 개의 서로 다른 값이 존재하는 컬럼을 SELECT 절에 넣으면 어떤 값이 출력될지 보장할 수 없으므로, 의도하지 않은 결과를 피하려면 GROUP BY 기준 컬럼과 SELECT 절의 일반 컬럼 관계를 항상 신중하게 설계해야 합니다.