Udemy 9강을 실습하며 위와 다음과 같은 에러가 발생했다.
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'section9.books.title' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
GROUP BY를 B라는 기준으로 하고, SELECT 하는 필드들이 A,B,C 등 B가 아닌 것들을 조회하려고 할때 발생한다.
MySQL에는 테이블의 무결성을 보호하고, 정확하고 일관된 결과를 만들기 위해 sql_mode를 사용하는데, 그 중 하나가 only_full_group_by
이다. 이 모드를 사용하는 목적은 SELECT 쿼리가 GROUP BY 절과 사용됐을때, 의미있는 결과를 생성하는 것을 보장하기 위함이다.
강사가 사용한 MySQL 버전(5.5)에서는 이 모드가 기본값 설정이 아니었으나 5.7 이상의 버전에서는 이 모드가 기본값으로 설정되어 위와 같은 에러가 발생한다.
모든 sql 모드를 비활성화하기 (비추천)
mysql> SET @@sql_mode='';
현재 sql 모드의 session variable을 다른 local variable에 저장해두어 필요한 쿼리문을 모두 실행한 후 기존의 모드가 필요할때 저장한 변수를 가져와 복구시킨다. (비추천)
mysql> SET @old_sql_mode=@@sql_mode;
mysql> SET @@sql_mode='';
mysql> SET @@sql_mode=@old_sql_mode;
위의 두 방법은 쿼리문을 실행할때 only_full_groupt_by 뿐만 아니라 필요할 수 있는 모든 sql 모드를 비활성화시키기 때문에 추천하지 않고, 다음 방법이 가장 적절한 해결방안이다.
mysql> SET @old_sql_mode=@@sql_mode;
mysql> SET @@sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY,', '');
mysql> SET @@sql_mode = @old_sql_mode;