3

集計関数が続く通常の列は、それらを含む場合にのみ許可されることを知っていGroup Byました。
しかし、なぜ次のように動作するのでしょうか?

mysql> select payee,sum(amount) from checks;  
+---------+-------------+  
| payee   | sum(amount) |  
+---------+-------------+  
| Ma Bell |      893.76 |  
+---------+-------------+  
1 row in set (0.00 sec)  
4

2 に答える 2

7

この動作は MySql の「拡張」です。

MySQL は の使用を拡張して、選択リストが句GROUP BYで指定されていない非集計列を参照できるようにします。GROUP BY

ただし、この動作は実際には MySql で構成可能な設定です

ONLY_FULL_GROUP_BY

選択リストまたは (MySQL 5.1.10 以降) HAVING リストが GROUP BY 句で指定されていない非集計カラムを参照するクエリを許可しないでください。

尊重し、集計されていないすべての列を追加することをお勧めします。特に、電源がオンになってgroup byいるサーバーにいつか移行する可能性がある場合は特にそうです。ONLY_FULL_GROUP_BY

于 2013-02-13T21:55:25.440 に答える
3

私が行うよりも優れた説明を行い、詳細に注意する編集マニュアル参照: http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

これは正常に動作することを目的としています。集計関数がなければ、クエリで返されるすべての行に対して実行されます。これがほとんど見られない理由は、実際に達成しようとしていることがめったにないからだと思います。とにかくグループ化することを計画していたものだけを返すことがわかっているwhere句がある場合、グループをドロップすることがよくあります。つまり、クエリが次の場合:

select payee,sum(amount) from checks where payee = 'Ma Bell'

次の group by は技術的に冗長です。

select payee,sum(amount) from checks where payee = 'Ma Bell' group by payee

個人的には、クロスプラットフォームでより一貫してサポートされていると思うので、通常は GROUP BY 句を含めますが、100% 確実ではありません。

繰り返しますが、上記のクエリでもう一度お尋ねします - 技術的には機能しますが、where 句なしで目的の結果が得られますか?

于 2013-02-13T21:48:22.377 に答える