はじめに
MySQL の GROUP BY 拡張機能この句では、グループ化に含まれていない列の選択を許可しているため、SQL への準拠に関して疑問が生じています。規格。この記事では、この逸脱の歴史的背景と影響について考察します。
標準
SQL-2003 より前は、非集計の選択を禁止するのが標準的な慣行でした。 GROUP BY 句の一部ではなかった列。この制限により、あいまいなグループ化が排除され、一貫した結果が保証されます。
MySQL の拡張機能
MySQL では、非集計カラムがその一部ではない場合でも選択できるようにする拡張機能が導入されました。 GROUP BY。 MySQL のドキュメントによると、これは不必要な並べ替えやグループ化を回避することでパフォーマンスを最適化するために行われます。ただし、これには注意事項があります。非集計値は不定になる可能性があります。つまり、サーバーは各グループから任意の値を選択できます。
標準 SQL 解釈
SQL-2003 標準では、グループ化列に機能的に依存している場合、または集計列に含まれている場合、選択リスト内で非集計列参照が許可されています。 口論。関数の依存関係により、グループ化カラムの値ごとに、非集計カラムに単一の一意の値が存在することが保証されます。
MySQL の実装
MySQL の拡張機能は、グループ化列に機能的に依存していない列も含めて、すべての列を選択できるようにすることで標準化されます。これにより、非集計値がグループ内で異なる場合に予期しない結果が生じる可能性があります。
MySQL の拡張の結果
MySQL の実装には、主に 2 つの影響があります:
MySQL のアドレス指定逸脱
MySQL ユーザーは、sql_mode を ONLY_FULL_GROUP_BY に設定することで、非標準の動作を無効にすることができます。さらに、標準への準拠を強化するための改良が MySQL 5.7 に導入されました。 PostgreSQL 9.1 は、機能の依存関係要件に厳密に準拠した、より制限的な実装も提供します。
以上がMySQL の非標準的な GROUP BY 動作は SQL 標準に違反しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。