MySQL에서 GROUP BY 절 없이 그룹 함수(집계 함수)와 일반 필드를 함께 사용하면 안 되는 이유는, 반환되는 결과가 사용자를 오도할 수 있기 때문입니다. 아래 'Student' 테이블을 예시로 들어 자세히 살펴보겠습니다.
mysql> Select * from Student; +------+---------+---------+-----------+ | Id | Name | Address | Subject | +------+---------+---------+-----------+ | 1 | Gaurav | Delhi | Computers | | 2 | Aarav | Mumbai | History | | 15 | Harshit | Delhi | Commerce | | 20 | Gaurav | Jaipur | Computers | +------+---------+---------+-----------+ 4 rows in set (0.00 sec) mysql> Select count(*), Name from Student; +----------+--------+ | count(*) | name | +----------+--------+ | 4 | Gaurav | +----------+--------+ 1 row in set (0.00 sec)
위 쿼리 결과를 보면, 그룹 함수 COUNT(*)는 테이블의 전체 행 수인 4를 정확하게 반환합니다. 하지만 함께 출력된 'Name' 필드의 값 'Gaurav'는 문제가 있습니다. 이 값이 어떤 기준으로 선택된 것인지 알 수 없기 때문입니다. 컬럼의 첫 번째 값인지, 아니면 여러 번 저장된 값 중 임의로 선택된 것인지 명확하지 않아 결과를 신뢰하기 어렵습니다.
GROUP BY 절을 추가한 경우의 결과
이제 동일한 쿼리에 GROUP BY 절을 추가하면 결과가 달라집니다.
mysql> Select count(*), name from student GROUP BY id; +----------+---------+ | count(*) | name | +----------+---------+ | 1 | Gaurav | | 1 | Aarav | | 1 | Harshit | | 1 | Gaurav | +----------+---------+ 4 rows in set (0.00 sec)
위 결과 집합에서 확인할 수 있듯이, GROUP BY 절을 사용하면 각 그룹(여기서는 각 학생)별로 정확한 집계 결과와 함께 해당하는 이름이 짝지어져 출력됩니다. 즉, 의미 있고 신뢰할 수 있는 결과를 얻을 수 있습니다.
추가로 알아두면 좋은 사항
참고로 MySQL 5.7 버전부터는 기본적으로 ONLY_FULL_GROUP_BY SQL 모드가 활성화되어 있습니다. 이 모드가 적용되면 GROUP BY 절에 포함되지 않은 일반 컬럼을 SELECT 절에서 사용할 때 오류가 발생하여, 애초에 모호한 쿼리 실행 자체를 차단합니다. 따라서 구버전 환경이라 하더라도 의도치 않은 잘못된 결과를 방지하려면 그룹 함수와 일반 필드를 함께 조회할 때 반드시 GROUP BY 절을 명시하는 습관을 들이는 것이 좋습니다.