はじめに
Microsoft SQL Server ユーザーが遭遇する問題MySQL に非グループ化カラムを集計で選択する機能を付与する MySQL ドキュメントの抜粋クエリ。この慣行は SQL 標準に矛盾しており、その合法性と影響について疑問が生じています。
標準 SQL の制限
SQL-92 標準では、範囲外の非集計フィールドの選択を禁止しています。集計クエリの GROUP BY 句。これは、返されたデータの整合性を確保し、あいまいな結果を防ぐためです。
MySQL の拡張
ただし、MySQL 5.5 以降では、GROUP BY 句が拡張され、機能的にグループ化に依存していない場合でも、非集計列の選択columns.
標準違反
この拡張機能は、非集計フィールドが機能的にグループ化列に依存しているか、グループ化列に含まれている必要がある SQL-2003 標準に反しています。集計式。
MySQL が実装された理由
MySQL によるこの拡張機能の実装は、不必要な列の並べ替えとグループ化を削減することでパフォーマンスを向上させるという SQL-2003 標準の目的に沿っています。ただし、MySQL の実装は、機能的に依存する列だけでなく、すべての列を許可するという点で標準から逸脱しています。
拡張機能の結果
この拡張機能には、不定の可能性があります。非集計列が各グループ内で一貫した値を持たない場合に結果が返されます。開発者は、この緩和されたグループ化メカニズムの下でクエリの有効性を確保するために注意する必要があります。
SQL Server の動作
MySQL とは異なり、SQL Server は SQL-92 に厳密に準拠しています。標準では、GROUP BY の一部ではない非集計フィールドの選択を禁止します。
回避策
MySQL を標準の動作に制限するには、sql_mode を "ONLY_FULL_GROUP_BY" に設定します。
新しい MySQL の拡張機能
MySQL 内5.7 では、GROUP BY の処理が改善され、関数の依存関係が認識され、SQL-2003 標準との整合性が向上しました。
結論
MySQL の GROUP BY 句の拡張により、開発者は集計クエリのグループ化されていない列。この標準からの逸脱によりパフォーマンスは向上しますが、不確実な結果が生じる可能性があります。このような落とし穴を避けるために、開発者は非集計カラムに注意し、標準に厳密に準拠するために MySQL の "ONLY_FULL_GROUP_BY" モードを検討する必要があります。
以上がMySQL の非標準の GROUP BY 句の動作は集計クエリにリスクをもたらしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。