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

MysqlのGroupByとOracleのGroupbyの動作が異なる理由

    MySQL設計者は、GROUP BYに非標準の拡張機能を追加しました 開発をより簡単にし、特定のクエリをより効率的にするために。

    これが彼らの論理的根拠です。

    https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

    ONLY_FULL_GROUP_BYと呼ばれるサーバーモードがあります 非標準の拡張機能を無効にします。このステートメントを使用して、このモードを設定できます。

     SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'  
    

    これがそのページからの引用で、強調が追加されています。

    ONLY_FULL_GROUP_BYの場合 が無効になっている場合、GROUP BYの標準SQL使用に対するMySQL拡張 選択リストを許可します、HAVING 条件、またはORDER BY 列がGROUP BYに機能的に依存していない場合でも、非集計列を参照するためのリスト 列...この場合、サーバーは各グループから任意の値を自由に選択できます 、したがって、それらが同じでない限り、選択された値は非決定的 、これはおそらくあなたが望むものではありません。

    ここで重要なのは非決定論的です。 どういう意味ですか?これはランダムですが、もっと悪いことを意味します。 サーバーがランダムな値を選択した場合、それは異なるクエリで異なる値を返すことを意味するため、ソフトウェアをテストするときに問題を見つける可能性があります。しかし、非決定論的 このコンテキストでは、サーバーが毎回同じ値を選択することを意味します。選択しないまで

    なぜそれが選択する値を変更するのでしょうか?サーバーのアップグレードが1つの理由です。テーブルサイズの変更は別の場合があります。重要なのは、サーバーは自由に必要な値を返すことができるということです。

    SQLを新たに学ぶ人々がこのONLY_FULL_GROUP_BYを設定することを望みます モード;クエリからはるかに予測可能な結果が得られ、サーバーは非決定論的なクエリを拒否します。



    1. Python、SQLite、SQLAlchemyによるデータ管理

    2. T-SQL SET演算子パート2:INTERSECTおよびEXCEPT

    3. SQL Serverで複合主キーを作成する方法(T-SQLの例)

    4. WHERE col IN(...)条件の制限