Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 GROUP BY 절 없이 그룹 함수와 일반 필드를 함께 사용하면 안 되는 이유

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 절을 명시하는 습관을 들이는 것이 좋습니다.