KEEP GOING
In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'run_lkzaoar5pql.Employee.employee_id'; this is incompatible with sql_mode=only_full_group_by 에러 발생 원인 본문
code review/sql
In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'run_lkzaoar5pql.Employee.employee_id'; this is incompatible with sql_mode=only_full_group_by 에러 발생 원인
jmHan 2022. 1. 28. 15:09반응형
-sql에서 GROUP BY를 사용하는 경우, SELECT에 적을 수 있는 컬럼은 GROUP BY에서 나열한 컬럼과 집계 함수만 올 수 있다. 따라서 다음과 같이
select col1, col2, count(col3) from table1
group by col1, col2; # 집계함수 이외의 모든 select 칼럼을 기입한다.
와 같은 방식으로 문제를 해결할 수 있다.
[예시1]
SELECT COUNT(employee_id)
FROM Employee
WHERE months * salary = (SELECT max(months * salary) FROM Employee);
이 경우에는 COUNT(employee_id)가 employee_id 컬럼의 데이터 개수를 카운트하기 때문에 문제없이 작동한다. 하지만
SELECT COUNT(salary), name
FROM Employee
WHERE months * salary = (SELECT max(months * salary) FROM Employee);
이런 식의 쿼리를 작성하면 오류가 발생하게 된다. SELECT에 적힌 컬럼 중 집계 함수 옆에 있는 employee_id 는 집계되지 않은 컬럼 즉, nonaggregated column 으로 인식된다.
보통 이렇게 SELECT 문에 집계 함수와 특정 속성이 오는 경우는 방금 든 예시처럼 이름 별로 salary 데이터 값을 카운트 해달라는 것처럼 GROUP BY를 유도하기 때문이다.
[예시2]
SELECT COUNT(salary), name
FROM Employee
WHERE months * salary = (SELECT max(months * salary) FROM Employee)
GROUP BY name;
따라서 다음과 같은 쿼리에서는 오류가 발생하지 않는다.
[예시3]
SELECT COUNT(name), employee_id
FROM Employee
WHERE months * salary = (SELECT max(months * salary) FROM Employee)
GROUP BY employee_id;
마찬가지로 집계 함수에 사용되는 컬럼은 GROUP BY에 나열될 필요가 없기 때문에 다음 쿼리도 오류가 발생하지 않는다.
[예시4]
SELECT *, COUNT(employee_id)
FROM Employee
GROUP BY employee_id;
다음과 같은 쿼리 역시 에러가 발생한다 왜냐하면 *는 테이블의 모든 컬럼을 뜻한다. 따라서 모든 컬럼을 GROUP BY에 나열해주어야 한다.
반응형
'code review > sql' 카테고리의 다른 글
[MySQL] LeetCode : Department Highest Salary Solution (0) | 2022.01.28 |
---|---|
[MySQL] HackerRank : Top Earners Solution (0) | 2022.01.28 |
데이터분석을 위한 고급 SQL : 서브쿼리(subquery) 예제 실습 (0) | 2022.01.27 |
[MySQL] LeetCode 196번 : Delete Duplicate Emails (0) | 2022.01.24 |
[MySQL] HackerRank : Occupations Solution (0) | 2021.12.23 |
Comments