ホームページ >データベース >mysql チュートリアル >MySQL の「GROUP BY」拡張機能は SQL 標準に準拠していますか、それとも逸脱ですか?

MySQL の「GROUP BY」拡張機能は SQL 標準に準拠していますか、それとも逸脱ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-07 03:56:10241ブラウズ

Does MySQL's `GROUP BY` Extension Conform to SQL Standards, or Is It a Deviation?

MySQL の GROUP BY 拡張: SQL 標準への準拠または逸脱?

概要

従来、SQL Server やその他の RDBMS では、非集計を選択していました集計クエリの GROUP BY 句の一部ではない列は、SQL 標準によって禁止されています。ただし、MySQL では、この動作は標準から逸脱しており、MySQL の準拠性について疑問が生じています。

MySQL の Extended GROUP BY

1992 年までの SQL バージョンでは、実際に標準でした。 GROUP BY 句に含まれていない非集計フィールドの選択を禁止します。ただし、SQL-2003 以降、標準ではグループ化列に機能的に依存する列を選択できるようになりました。

MySQL は、この新しい標準の実装に熱心に取り組んでおり、すべての列を選択できるように GROUP BY を拡張しました。グループ化列に機能的に依存するものだけではありません。この拡張機能は最新の SQL 標準に準拠していますが、その実装は意図された動作から逸脱しています。

MySQL の拡張機能の結果

SELECT リスト内のすべての列 (それらの列も含む) を許可します。機能的に依存していないため、グループ化されていない列にグループ内で異なる値が含まれている場合、不確定な結果が生じる可能性があります。この標準からの逸脱は、ユーザーに混乱や予期せぬ動作を引き起こす可能性があります。

これに対処するために、MySQL は ONLY_FULL_GROUP_BY sql_mode を導入しました。これにより、MySQL の拡張された GROUP BY 動作が無効になり、より制限的な SQL に戻ります。 -92 standard.

MySQL の理論的根拠と他の RDBMS との比較

MySQL のこの拡張機能の理論的根拠は、パフォーマンスの最適化です。 SELECT リスト内のすべての列を許可することで、MySQL は不必要な並べ替えやグループ化を回避し、パフォーマンスの向上につながります。

ただし、PostgreSQL やそれ以降のバージョンの MySQL (5.7) などの他の RDBMS は、より標準に準拠したアプローチを実装しています。関数の依存関係を認識し、それに応じて SELECT リスト内の非集計列を制限します。これにより、パフォーマンスと SQL 標準への準拠の両方が保証されます。

結論

MySQL の拡張 GROUP BY は、SQL 標準からインスピレーションを受けていますが、意図された実装からは逸脱しています。この拡張は不確定な結果をもたらす可能性があり、関数の依存関係をより微妙に理解する必要があります。 ONLY_FULL_GROUP_BY sql_mode を設定すると、ユーザーはより制限的な SQL-92 の動作に戻すことができます。 MySQL の新しいバージョン (5.7) では、GROUP BY の処理が改善され、標準との整合性が向上しました。

以上がMySQL の「GROUP BY」拡張機能は SQL 標準に準拠していますか、それとも逸脱ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。