sql >> データベース >  >> RDS >> Mysql

MySQLは、group by句の一部ではない列を選択できるようにすることで標準を破っていますか?

    非集計フィールドを選択できないため、標準SQLはクエリを拒否します GROUPBY句の一部ではありません 集計クエリで

    これは正しい、1992年まで

    しかし、2003年以降は明らかに間違っています。

    SQL-2003標準から、 6IWD6-02-Foundation-2011-01.pdf、httpから://www.wiscorp.com/ 、段落-7.12(クエリ仕様)、398ページ

    1. Tがグループ化されたテーブルの場合、GをTのグループ化列のセットとします。((select list))に含まれる各((value expression))で、Tの列を参照する各列参照はいくつかを参照します。 機能に依存する列C Gでまたは 集約された引数に含まれる ((集合関数仕様))の集計クエリがQSである

    現在、MYSQLは、だけでなくを許可することにより、この機能を実装しています。 機能に依存する列 グループ化列でしかし すべての列を許可する 。これにより、グループ化がどのように機能するかを理解していないユーザーに問題が発生し、予期しない結果が得られます。

    しかし、MySQLがSQL標準と競合する機能を追加したと言うのは正しいです(間違った理由でそう思っているようですが)。 SQL標準機能が追加されているため、完全に正確ではありませんが、最善の方法ではありませんが(より簡単な方法のように)、最新の標準と競合します。

    あなたの質問に答えるために、このMySQL機能(拡張)の理由は、最新のSQL標準(2003+)に準拠していると思います。彼らがこの方法でそれを実装することを選んだ理由(完全に準拠していない)、私たちは推測することしかできません。

    @Quassnoiと@Johanが例で答えたように、これは主にパフォーマンスと保守性の問題です。しかし、機能に依存する列を認識するのに十分賢い(Skynetを除く)ようにRDBMSを簡単に変更することはできないため、MySQL開発者は次の選択を行いました。

    私たち(MySQL)はあなた(MySQLユーザー)にSQL-2003標準にあるこの機能を提供します。特定のGROUPBYの速度が向上します クエリがありますが、落とし穴があります。 SELECT の列に注意する必要があります(SQLエンジンではありません)。 およびHAVING リストは機能的にGROUPBYに依存しています 列。そうしないと、結果が不確定になる可能性があります。

    無効にする場合は、 sql_modeを設定できます ONLY_FULL_GROUP_BY

    それはすべて MySQLドキュメント: GROUP BY (5.5) -上記の文言ではなく、あなたの引用のようですが(彼らは、標準のSQL-92ではなく、標準のSQL-2003からの逸脱であると言うのを忘れていました)。この種の選択は、他のRDBMSを含め、すべてのソフトウェアで一般的だと思います。これらは、パフォーマンス、下位互換性、およびその他の多くの理由で作成されています。 Oracleには有名な''はNULLと同じです たとえば、SQL-Serverにもおそらくいくつかあります。

    Peter Boumanによるこのブログ投稿もあり、MySQL開発者の選択が守られています:GROUPBYの神話を暴く

    2011年には、 @MarkByers として コメント(DBA.SEの関連質問)で、 PostgreSQL9.1に新機能が追加されました (リリース日:2011年9月)この目的のために設計されました。 MySQLの実装よりも制限が厳しく、標準に近いです。

    その後、2015年にMySQLは、5.7バージョンで動作が改善され、標準に準拠し、実際に機能の依存関係を認識するようになったと発表しました(Postgresの実装よりも優れています)。ドキュメント:MySQLによるGROUPBYの処理 (5.7) およびPeterBoumanによる別のブログ投稿: MySQL 5.7.5: GROUP BY 機能依存性を尊重します!



    1. 図書館プロジェクトでのRoomDBの使用

    2. 1つのテーブルに複数の主キーが存在できますか?

    3. DockerコンテナへのPostgreSQLのデプロイ

    4. PostgreSQL-HTMLエンティティを置き換えます