출처:
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
'MySQL' 카테고리의 다른 글
[해커랭크] [SQL] The PADs (1) | 2023.01.30 |
---|---|
[leetcode] [MySQL] 176. Second Highest Salary (1) | 2022.12.27 |
[프로그래머스 ] [sql] lv1. 12세 이하인 여자 환자 목록 출력하기 (1) | 2022.12.08 |
프로그래머스 [SQL] Lv1. 흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2022.12.08 |
[MYSQL], [ORACLE] CASE WHEN 여러개 사용하기 (0) | 2022.11.24 |