2011年3月4日金曜日

MySQLで GROUP BYにない列を SELECTした場合、グループ内のどの行の値になるかは分からない

MySQL :: MySQL 5.5 Reference Manual :: 11.16.3 GROUP BY and HAVING with Hidden Columns
When using this feature, all rows in each group should have the same values for the columns that are ommitted from the GROUP BY part. The server is free to return any value from the group, so the results are indeterminate unless all values are the same.

MySQLではSQL標準に反して、GROUP BY句にない列をSELECT句やHAVING句で使うことができる。想定しているのは上記リンク先のように、複数のテーブルを結合した場合等にGROUP BY句にあるキー列により一意に決まる(どれも同じになる)従属項目を使うこと。
これによりMySQLは処理を高速化できる。

しかし、違うデータが入っているかもしれない列を使うと、どの行のデータが使われるかは決められていない。(たぶん「物理的に」一番最初のデータとかが使われそう。)


PostgreSQLも9.1から同様のことができるようになるらしい(MySQLに合わせるため)。

PostgreSQL 9.1 の新機能 — Let's Postgres
標準SQLでは必ず GROUP BY にも列名を書く必要があるのですが、MySQL では許されているため、「なぜ PostgreSQL
では受け付けないのか?」という質問が良くありましたが、互換性が向上したと思われます。ただ、プライマリキーが必須であること、つまり省略した列がラン
ダムに選択されることはないよう制限しているのは、PostgreSQL の設計思想が反映されていると言えるでしょう。


プライマリーキーが必須っていうのは、JOINした場合の親テーブルの従属項目を使うことのみを想定しているということかな?

0 件のコメント:

ブログ アーカイブ

カテゴリー