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에 나열해주어야 한다.

반응형
Comments