MySQLの5.7のgroup byのONLY_FULL_GROUP_BYありなしの挙動の違いメモです。
(確認環境:MySQL 5.7.41)
目次
サンプル | 目的と環境 |
ONLY_FULL_GROUP_BYの有りで実行した場合 | |
ONLY_FULL_GROUP_BYの無しで実行した場合 | |
MySQL5.6で確認した場合 |
目的と環境
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
関連の記事