๊ณต๋ถ€/DB

[MySQL] ONLY_FULL_GROUP_BY ์—๋Ÿฌ

๐Ÿ’™young๐Ÿ’™ 2022. 5. 20. 10:14

๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ GROUP BY๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Query์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

"Expression #20 of SELECT list is not in GROUP BY clause and contains nonaggregated column '์ปฌ๋Ÿผ๋ช…' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"

 

๊ฒ€์ƒ‰์„ ํ•ด๋ณด๋‹ˆ MySQL 5.7 Version ๋ถ€ํ„ฐ SQL_MODE๊ฐ€ ์ƒ๊ฒผ๋‹ค๊ณ  ํ•œ๋‹ค. (์ฐธ๊ณ )

SQL_MODE๋Š” MySQL์— ์ €์žฅ๋  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(validation check) ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๋Š” ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์ด๋‹ค.

 

์—๋Ÿฌ๋Š” SQL_MODE์˜ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์ธ ONLY_FULL_GROUP_BY์™€ ๊ด€๋ จ๋œ ๊ฒƒ์ด์—ˆ๋‹ค.

MySQL 8.0์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ONLY_FULL_GROUP_BY ์˜ต์…˜์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, OS์˜ ์ฐจ์ด์ธ์ง€ ๋‚ด ๊ฐœ๋ฐœํ™˜๊ฒฝ์—๋Š” ์ ์šฉ๋˜์–ด ์žˆ์ง€ ์•Š์•˜๋‹ค. (์•„๋งˆ Windows OS์—ฌ์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ด ์•„๋‹๊นŒ ์ถ”์ธก)

๊ทธ๋ž˜์„œ ๋กœ์ปฌ์—์„œ๋Š” ์ œ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋˜ ๊ธฐ๋Šฅ์ด ์„œ๋ฒ„์— ์˜ฌ๋ ธ์„ ๋•Œ ONLY_FULL_GROUP_BY ์˜ต์…˜์— ๊ฑธ๋ ค์„œ ๋จนํ†ต์ด ๋œ ๊ฒƒ์ด๋‹ค.

๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ํ†ต์ผํ•˜๊ธฐ ์œ„ํ•ด SQL_MODE์˜ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

 

 

์ฟผ๋ฆฌ ์ˆ˜์ •ํ•˜๊ธฐ

GROUP BY์ ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ SELECT ํ•ด์™€์•ผ ํ•˜๋Š” ์ปฌ๋Ÿผ์„ ๋ชจ๋‘ ๋‚˜์—ดํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. GROUP BY์— ์„ ์–ธ๋˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

SELECT name, ANY_VALUE(email), Max(age) 
FROM MEMBER
GROUP BY name;

 

GROUP BY๋กœ ๋ฌถ์–ด์ฃผ์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ์— ANY_VALUE() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

SQL_MODE ์˜ต์…˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

ํ˜„์žฌ ์ ์šฉ๋˜์–ด ์žˆ๋Š” SQL_MODE๋ฅผ ์กฐํšŒ

 

MySQL ์„œ๋ฒ„์— ์ ‘์†(mysql -u root -p) ํ›„ SELECT @@SQL_MODE; ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ ์ ์šฉ๋˜์–ด ์žˆ๋Š” SQL_MODE ์˜ต์…˜์„ ์กฐํšŒํ•œ๋‹ค. 

 

SELECT @@SQL_MODE;

 

SQL_MODE๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด my.ini (Windows OS) ํŒŒ์ผ์— SQL_MODE ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

** my.ini ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

1. ์‹คํ–‰์ฐฝ(์œˆ๋„์šฐํ‚ค + R)์—์„œ services.msc ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์ฐฝ ์—ด๊ธฐ

2. MySQL80์˜ ์†์„ฑ์—์„œ ์‹คํ–‰ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธ (C:\ProgramData\MySQL\MySQL Server 8.0\my.ini)

 

 

 

 

์„ค์ • ์ถ”๊ฐ€ํ•˜๊ธฐ

my.ini ํŒŒ์ผ์—์„œ [mysqld] ๊ตฌ๊ฐ„์— sql_mode ์†์„ฑ์˜ ํ•„์š”ํ•œ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

 

** my.ini ํŒŒ์ผ์˜ ์ˆ˜์ • ๊ถŒํ•œ ๋ณ€๊ฒฝํ•˜๊ธฐ

๊ถŒํ•œ์ด ์—†์–ด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋œจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ๋Š” ์‚ฌ์šฉ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

my.ini ์˜ค๋ฅธ์ชฝ ํด๋ฆญ-์†์„ฑ-๋ณด์•ˆ ํƒญ์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•ด์ฃผ๋ฉด ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

 

 

์ฐธ๊ณ 
https://info-lab.tistory.com/274

https://velog.io/@heumheum2/ONLYFULLGROUPBY

https://blog.jiniworld.me/64