MySQL では、次のようなビューが許可されるシナリオに遭遇する可能性があります。
SELECT AVG(table_name.col1), AVG(table_name.col2), AVG(table_name.col3), table_name.personID, table_name.col4 FROM table_name GROUP BY table_name.personID;
このクエリには、col1、col2、col3 の集計関数が含まれています。ただし、集計なしでcol4も選択されます。通常、このようなクエリは Microsoft SQL Server などの他のデータベース システムでは無効とみなされます。
しかし、MySQL では、この動作が許可されています。その理由を理解することが重要です。
GROUP BY クエリで非集計カラムを選択する場合、MySQL はグループから任意の値を選択します。これは通常、グループに最初に保存されている行の値に対応します。
この機能により、非集計列に選択された値が異なるクエリになる可能性があります。グループ内の行の順序に従って。たとえば、以下のクエリは、行の順序に応じて、同じ personID のcol4 に対して異なる値を返す可能性があります。
SELECT AVG(table1.col1), table1.personID, persons.col4 FROM table1 JOIN persons ON (table1.personID = persons.id) GROUP BY table1.personID;
曖昧さを避けるために、機能的に適切な列を選択することが重要です。 GROUP BY 基準の列に依存します。これは、グループ化カラムの一意の値ごとに、「曖昧な」カラムに取り得る値が 1 つだけである必要があることを意味します。
MySQL は ONLY_FULL_GROUP_BY SQL モードを提供します。を有効にして、MySQL を ANSI SQL 標準に準拠させることができます。このモードでは、GROUP BY クエリで非集計カラムを選択すると、それらのカラムがグループ化カラムに機能的に依存していない限り、エラーが発生します。
一方、MySQL では非集計カラムを選択できます。 GROUP BY クエリの集計列を使用する場合、あいまいな結果が発生する可能性があることを認識することが重要です。確実に決定的なクエリを実現するには、関数に依存する列によって明確にグループ化されるようにクエリを書き直すか、ONLY_FULL_GROUP_BY モードを有効にすることをお勧めします。
以上がMySQL が GROUP BY クエリで非集計列を許可するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。