ホーム > 未分類 > MySQLのGROUP BYは、寛容すぎて気持ちが悪い。

MySQLのGROUP BYは、寛容すぎて気持ちが悪い。

以前の職場ではOracleばかり使っていたのですが、MySQLを使うようになってちょっとカルチャーショック、というお話。

以下のようなテーブルがあってですよ、

mysql> SELECT table_a.* FROM table_a;
+-------+-------+-------+
| col_a | col_b | col_c |
+-------+-------+-------+
|     1 |     1 |     1 | 
|     2 |     1 |     2 | 
|     3 |     2 |     2 | 
|     4 |     2 |     1 | 
+-------+-------+-------+
4 rows in set (0.00 sec)

以下のように、GROUP BYに含まれない列でもSELECTできちゃうんですね。

mysql> SELECT col_b, col_c FROM table_a GROUP BY col_b;
+-------+-------+
| col_b | col_c |
+-------+-------+
|     1 |     1 | 
|     2 |     2 | 
+-------+-------+
2 rows in set (0.00 sec)

col_cの値はどれがSELECTされるのだろう…。物理的な先頭行の値?

Oracleだとたしか構文エラーになったよなーなんて思っていたのですが、ちゃんと「MySQLによる拡張です」って書いてありました。
本家ドキュメント:MySQL extends the use of GROUP BY…

前述のようなケースは「やっちゃだめ」とも書いてありますね。

Do not use this feature if the columns you omit from the GROUP BY part are not constant in the group.

さらに環境変数 sql_modeONLY_FULL_GROUP_BY を設定すれば、この拡張は抑制されるみたい。

mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT col_b, col_c FROM table_a GROUP BY col_b;
ERROR 1055 (42000): 'database_a.table_a.col_c' isn't in GROUP BY

あいまいなSQLを未然に防止するためには、設定しておいた方がいい気がする…。

カテゴリー: 未分類 タグ: