ホームページ >データベース >mysql チュートリアル >MySQL と PostgreSQL で「GROUP BY」句の動作が異なるのはなぜですか?
MySQL と PostgreSQL GROUP BY
句: 比較
MySQL と PostgreSQL では、GROUP BY
句の処理方法が異なります。 この句は、指定された列に基づいて行をグループ化し、グループ化されたデータに対する集計関数の計算を有効にします。 主な違いを見てみましょう。
一般的なシナリオには、列 the_table
、col1
、および col2
を含むテーブル (例: col3
) が含まれます。 MySQL では、SELECT col2, col3, col1 FROM the_table GROUP BY col2;
のようなクエリは、各 col3
グループ内の col1
と col2
に任意の値を選択しているように見える結果を返すことがあります。 ただし、PostgreSQL で同じクエリを実行するとエラーが発生します。
PostgreSQL エラーが発生するのはなぜですか?
PostgreSQL は SQL 標準に厳密に準拠しています。 標準では、SELECT
句に含まれていない GROUP BY
リスト内の列は、集計関数の一部であることが 必要です と義務付けられています。 この例では、col3
と col1
がこのルールに違反します。
集計関数の説明
集計関数 (MIN
、MAX
、AVG
、SUM
、COUNT
など) は、複数の行から 1 つの値を計算します。 これらは、グループ化されたデータを要約するために不可欠です。
MySQL の非標準動作
MySQL の動作は標準から逸脱しています。 GROUP BY
句にない非集計列を選択することはできますが、これは信頼できません。これらの列に選択される値は予測不可能であり、データベースの内部動作に依存します。一貫性があることは保証されていません。
標準準拠のクエリ
両方のデータベースで一貫性のある予測可能な結果を保証するには、GROUP BY
句に存在しない列には常に集計関数を使用します。 次のクエリは MySQL と PostgreSQL の両方で正しく動作します:
<code class="language-sql">SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1 FROM the_table GROUP BY col2;</code>
このクエリは、MIN()
を使用して各 col3
グループの col1
と col2
の最小値を検索し、明確に定義された結果を提供します。 MIN()
を MAX()
、AVG()
などの他の集計関数に置き換えると、グループごとに異なる概要統計が提供されます。 このアプローチにより、標準 SQL への準拠が保証され、MySQL の非標準 GROUP BY
拡張機能に固有のあいまいさが回避されます。
以上がMySQL と PostgreSQL で「GROUP BY」句の動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。