これらのクエリはすべて、SQL 標準に準拠している SQL プラットフォームでは構文エラーになります。
SELECT * FROM plant ORDER BY SUM(id);
SELECT * FROM plant ORDER BY COUNT(fruit);
SELECT * FROM plant ORDER BY COUNT(*);
SELECT * FROM plant ORDER BY SUM(1) DESC;
たとえば、PostgreSQL では、これらすべてのクエリで同じエラーが発生します。
エラー: 列 "plant.id" は GROUP BY 句に指定するか、集計関数で使用する必要があります
これは、GROUP BY を使用せずにドメイン集計関数を使用していることを意味します。SQL Server と Oracle は同様のエラー メッセージを返します。
MySQL の GROUP BY は、少なくとも標準的な動作に関する限り、いくつかの点で壊れていることが知られています。しかし、あなたが投稿したクエリは、私にとって新しい壊れた動作だったので、+1.
内部で何をしているのかを理解しようとするよりも、標準的な GROUP BY クエリの書き方を学んだほうがよいでしょう。私の知る限り、MySQLは標準の GROUP BY ステートメントを正しく処理します。
以前のバージョンの MySQL ドキュメントでは、GROUP BY と非表示の列について警告されていました。(参考文献はありませんが、このテキストはあちこちで引用されています。)
GROUP BY 部分から除外する列がグループ内で一定でない場合は、この機能を使用しないでください。サーバーはグループから任意の値を自由に返すことができるため、すべての値が同じでない限り、結果は不確定です。
最近のバージョンは少し異なります。
この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。
個人的には、SQL の機能が不確定であるとは考えていません。