MySQL では、集計関数または GROUP BY に含まれていないカラムを選択することができます。この句は、他の SQL データベースから来たプログラマーにとって混乱を招く可能性があります。この動作は、選択されたすべての列がグループ化の一部であるか、集計関数に表示される必要がある ANSI SQL 標準から逸脱しています。
曖昧なクエリと任意の値の選択
MySQL がそのようなクエリに遭遇すると、各グループのカラムから任意の値 (通常は最初の値または最初の値) を黙って返します。グループの最後の行。この動作により、特にグループ化されていない列の値が各グループ内で一貫していない場合、あいまいな結果が生じる可能性があります。
クエリの例
次の 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;
このクエリでは、col4 は GROUP BY 句または集計関数の一部ではありません。 MySQL は各グループのcol4 の値を任意に選択します。これは、グループ内の異なる行のcol4の値が異なる場合に問題となる可能性があります。
関数の依存関係と決定的な結果
MySQL では、グループ化されていない列が機能的に選択されている場合にそれらを選択できます。 GROUP BY 句の列に依存します。これは、グループ化列の各値に対して、グループ化されていない列に取り得る値は 1 つだけであることを意味します。このような場合、クエリは決定的な結果を返します。
ただし、あいまいなクエリでの MySQL の動作は将来のバージョンで変更される可能性があることに注意することが重要です。したがって、グループ化されていない列が GROUP BY 句または集計関数に明示的に含まれていない限り、SELECT 句では使用しないことをお勧めします。
"ONLY_FULL_GROUP_BY" SQL モード
MySQL 5.7 では、「ONLY_FULL_GROUP_BY」SQL モードが導入されました。 GROUP BY クエリの ANSI SQL 標準。このモードが有効な場合、集計関数を使用せずにグループ化されていない列を選択すると、エラーが発生します。
以上がMySQL で GROUP BY 句にない列の選択が許可されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。