본문 바로가기

MySQL

[oracle] [mysql] group by 시 유의사항

출처:

http://jason-heo.github.io/mysql/2014/03/05/char13-mysql-group-by-usage.html

https://school.programmers.co.kr/questions/38703

 

GROUP BY 에서 SELECT할 수 있는 컬럼은 다음과 같다.

  • GROUP BY에 나열된 컬럼
  • SUM(), COUNT() 같은 집계 함수(Aggregation Function)으로 한정된다.

그런데 oracle은 만약에 위에 해당하지 않은 컬럼(group by에 나열되지 않고,

집계함수가 아닌 컬럼)을 SELECT 하면  “not a GROUP BY expression” 이라는 오류가 뜬다.

하지만 mysql은 오류가 나지 않는다.

 

group by 오류의 예시:

아래와 같이 order 테이블이 있다고 하면 

+------+---------+-------+
| id   | revenue | month |
+------+---------+-------+
| 1    | 8000    | Jan   |
| 2    | 7000    | Jan   |
| 3    | 6000    | Jan   |
+------+---------+-------+

아래와 같은 쿼리를 작성하면 어떻게 될까? 

SELECT
  id,
  month,
  MAX(revenue) AS revenue
FROM Orders
GROUP BY month

DBMS 입장에서는 어떤 id 필드의 값을 반환해야 하는지 알 수 없기 때문에 오류가 나게 되는데 

 

이때 oracle 은 “not a GROUP BY expression” 이라는 오류 표시를 나타내어 오류가 있음을 알려주지만, 

mysql 은 오류가 나지 않고 id 필드의 값으로 1 혹은 어떤 값들 중 임의의 값 하나를 무작위로 반환할 것이다.

 

Mysql 에서 group by 오류 방지하는 방법

 MySQL에서도 설정 값 변경을 통해 잘못된 GROUP BY를 사용하는 경우 에러를 발생하도록 할 수 있다.

바로 sql_mode를 "ONLY_FULL_GROUP_BY" 옵션으로 변경하는 것이다. 

하지만 이 옵션은 기본적으로 비활성화되어 있으며, 활성화를 시켜야한다. 

 

다음은 ONLY_FULL_GROUP_BY 옵션을 활성화시킨 쿼리이다.

mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

이후 group by 오류가 난 쿼리를 실행하면 다음과 같은 오류 표시가 뜬다.

 

 

SELECT
  id,
  month,
  MAX(revenue) AS revenue
FROM Orders
GROUP BY month

ERROR 1055 (42000): 'db_name.id' isn't in GROUP BY