Computer Science/Database

[MySQL] ์˜ค๋ฅ˜ 1055 : ONLY_FULL_GROUP_BY : GROUP BY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๐Ÿ”ฎ Bailey 2020. 1. 31. 00:02

MySQL์—์„œ GROUP BY ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ข…์ข… ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ์™€ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค

โ€‹

ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and 
contains nonaggregated column 'DATABASE.TABLE.COLUMN' which is not functionally dependent on
columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

 

๋ถ„๋ช…ํžˆ ๋ฌธ๋ฒ•์€ ํ‹€๋ฆฌ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์€๋ฐ ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ๋ž€ ๋ง์ธ๊ฐ€? ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•ด๋ณด๋ฉด ๋œ๋‹คโ€‹

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

 

MySQL :: MySQL 5.7 Reference Manual :: 12.20.3 MySQL Handling of GROUP BY

12.20.3 MySQL Handling of GROUP BY SQL-92 and earlier does not permit queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are not named in the GROUP BY clause. For example, this query is illegal in stan

dev.mysql.com

 

ํ•ด๋‹น ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๋กœ์ปฌ MySQL์„ 5.7.14๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด์„œ

group by ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋น„ํšจ์œจ์„ฑ ํ•ด๊ฒฐ์„ ์œ„ํ•ด sql_mode ํ”Œ๋ž˜๊ทธ์— only_full_group_by ๋ฅผ ์ถ”๊ฐ€์‹œ์ผฐ๋‹ค๊ณ  ํ•œ๋‹ค

โ€‹

๊นŠ๊ฒŒ ์ดํ•ดํ•  ํ•„์š” ์—†์ด ๋ฐ”๋กœ ํ•ด๊ฒฐํ•˜์ž

 

mysql> SHOW VARIABLES LIKE 'SQL_MODE';
+---------------+---------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                       |
+---------------+---------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------+---------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select @@sql_mode;
+---------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                  |
+---------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

 

์ด๋ ‡๋“ฏ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜„์žฌ ์„ค์น˜๋œ sql_mode ์˜ ๊ฐ’์„ ํ™•์ธํ•œ ํ›„ (์„ค์น˜๋ฒ„์ „๋งˆ๋‹ค ์ƒ์ดํ•  ์ˆ˜ ์žˆ๋‹ค)

์—ฌ๊ธฐ์„œ ONLY_FULL_GROUP_BY ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›Œ์ค€๋‹ค

โ€‹

๊ธฐ์กด์˜ ๊ฐ’๋“ค์„ ๋ณต์‚ฌํ•œ ํ›„ ONLY_FULL_GROUP_BY ๋งŒ ์ œ์™ธํ•˜๊ณ  ๋‹ค์‹œ ์„ธํŒ…ํ•ด์ฃผ๋ฉด ๋œ๋‹ค

 

SET @@SQL_MODE='NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 1 warning (0.00 sec)

 

๋‹ค์‹œ sql_mode๋ฅผ ์กฐํšŒํ•ด๋ณด๋ฉด ONLY_FULL_GROUP_BY ๊ฐ€ ์‚ฌ๋ผ์ ธ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

group by ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋œ๋‹ค๋ฉด ์„ฑ๊ณต!