MySQL GROUP BY の非集計カラム: 標準からの逸脱
MySQL の GROUP BY 実装では、非集計カラムを含めることができますグループ化基準に含まれていない場合でも、SELECT リストに含めます。この動作は、そのようなクエリでグループ化されていない列の選択を禁止する ANSI SQL 標準とは異なります。
この矛盾は、関数の依存関係の概念から生じます。 MySQL では、グループ化されていないカラムがグループ化カラムに機能的に依存している場合、MySQL は黙ってそのカラムの単一の値を選択して返します。ただし、関数の依存関係が強制されていない場合、このようなクエリがあいまいな結果になる可能性があることに注意することが重要です。
たとえば、次のクエリは ANSI SQL では無効です:
SELECT AVG(table1.col1), table1.personID, persons.col4 FROM table1 JOIN persons ON (table1.personID = persons.id) GROUP BY table1.personID;
MySQL では、person.col4 が結合を通じて table1.personID に機能的に依存しているため、このクエリが許可されます。ただし、複数の人が同じ personID を持つ場合、persons.col4 の結果は任意になる可能性があります。
このような曖昧さを防ぐために、MySQL は ONLY_FULL_GROUP_BY SQL モードを提供します。これは、ANSI 標準に準拠したより厳格なグループ化ルールを適用します。デフォルトでは、このモードは有効になっていませんが、クエリが標準の動作に準拠していることを確認するためにアクティブにすることができます。
SQLite では GROUP BY クエリで非集計列も許可されますが、最後の値が選択されることに注意してください。任意ではなくグループ内で。将来のバージョンでは変更される可能性があるため、この動作に依存しないでください。曖昧さを避けるために、クエリを曖昧さのない決定的なものに書き直すことをお勧めします。
以上がMySQL は GROUP BY 句の非集計列をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。