MySQL 5.7のgroup byのONLY_FULL_GROUP_BYありなし

MySQLの5.7のgroup byのONLY_FULL_GROUP_BYありなしの挙動の違いメモです。
(確認環境:MySQL 5.7.41)

目次

サンプル 目的と環境
  ONLY_FULL_GROUP_BYの有りで実行した場合
  ONLY_FULL_GROUP_BYの無しで実行した場合
  MySQL5.6で確認した場合

目的と環境

productテーブル
id name price1 price2 price3
1 type1 100 200 300
2 type2 100 200 300
3 type3 100 200 300

MySQL5.7の環境で、上記のテーブルに対してselect文のgroup byで検索します。

sql_modeのONLY_FULL_GROUP_BYの有りと無しにします。

sql_modeは以下のコマンドで確認します。

SELECT @@global.sql_mode;

sql_modeの変更は

C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
の以下を書き換えました。

sql-mode=
"ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

設定を反映時は、MySQLを再起動します。

 

ONLY_FULL_GROUP_BYの有りで実行した場合

SELECT price1, price2, SUM(price3)
FROM product
GROUP BY price1;

上記SQLを実行すると以下のエラーがでて実行できません。

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

 

以下のようにgroup byにselect句にあるprice2まで含めるとエラーにならず実行できます。

mysql> SELECT price1, price2, SUM(price3)
    -> FROM product
    -> GROUP BY price1,price2;
+--------+--------+-------------+
| price1 | price2 | SUM(price3) |
+--------+--------+-------------+
|    100 |    200 |         900 |
+--------+--------+-------------+
1 row in set (0.00 sec)

mysql>

 

ONLY_FULL_GROUP_BYの無しで実行した場合

ONLY_FULL_GROUP_BYの有りで実行した場合はエラーになりますが、無しにするとエラーにならず実行できます。

SELECT price1, price2, SUM(price3)
FROM product
GROUP BY price1;

 

 

MySQL5.6で確認した場合

MySQL5.6でも同じくMySQL5.7と同じくONLY_FULL_GROUP_BYの有りでエラーになり
ONLY_FULL_GROUP_BYの無しでエラーになりませんでした。

my.iniファイルのsql_modeを修正

sql_mode=ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

5.6のエラーメッセージ

ERROR 1055 (42000): 'testdb.product.price2' isn't in GROUP BY

関連の記事

MySQL コマンドの一覧

△上に戻る