この機能はいくつかのあいまいなクエリを許可し、その列から選択された任意の値を含む結果セットをサイレントに返すことは事実です。実際には、最初に物理的に保存されるのは、グループ内の行の値になる傾向があります。
GROUP BY基準の列に機能的に依存する列のみを選択する場合、これらのクエリはあいまいではありません。つまり、グループを定義する値ごとに「あいまいな」列の個別の値が1つしかない場合は、問題はありません。このクエリは、論理的にあいまいさをもたらすことはできませんが、Microsoft SQL Server(およびANSI SQL)では違法です:
SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;
また、MySQLにはSQLモードがあり、標準に従って動作します。 ONLY_FULL_GROUP_BY
FWIW、SQLiteはこれらのあいまいなGROUP BY句も許可しますが、 lastから値を選択します グループ内の行。
少なくとも私がテストしたバージョンでは。 任意であることの意味 MySQLまたはSQLiteのいずれかが将来それらの実装を変更し、いくつかの異なる動作をする可能性があるということです。したがって、このようなあいまいなケースで現在のように動作を維持することに依存するべきではありません。クエリを書き直して、決定論的で曖昧にならないようにすることをお勧めします。これが、MySQL5.7がデフォルトでONLY_FULL_GROUP_BYを有効にする理由です。