2016-07-12 11 views
1

最近、私はpatientIDが私Samples表に複製されているという事実にもかかわらず、次のクエリは、集計関数が指定されていない場合、MySQLは何を行いますか?

SELECT * FROM Samples GROUP BY patientID 

を動作し、複数の列に複数の値を返すことがわかりました。

デフォルトで使用する集約関数は何ですか?

+0

非厳密モードでは可能です。この[doc](http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html)をご覧ください – 1000111

答えて

3

まず、これは不正な形式のSQLであり、単に使用しないでください。

しかし、それはどうしますか? PatientIdごとに1行の結果セットを返します。 SELECT *で指定されている追加の列は、のデータ内で不確定の行になります。余分な列が同じ行から来るという保証はありません。

実際には、値は、最初に見つかった行からの値がであると思われます。しかし、MySQLはこの動作に依存できないことを明示しています。一般に、SELECTには、GROUP BYにない集約されていない列を持つ集計文を使用しないでください。他のデータベースでは、この構文はサポートされていません(GROUP BYキーが集計対象のデータに対して一意の/主キーを形成しない限り)。

1

MySQLは全く集計関数を使用するためには表示されませんCOUNT、このようSUM、AVGなどの集計関数を使用します佗持っています。 、それらが同じである場合を除き、選択された値は不定であるので、この場合

、サーバは、各グループからの任意の値を選択する自由である。この場合、選択されたレコードはdocumentation状態として、不確定でありますおそらくあなたが望むものではありません。

しかし、なぜこの機能が最初に存在するのか不思議に思うかもしれません。列内のすべての値が同じであることが分かっているクエリを作成している場合、この機能は結合またはサブクエリを記述する必要がないため、厳密に準拠させることができます。

+0

集計関数を使用せずに複数の値を1つの値に変換することは数学的に不可能です。あなたが何を記述しているかは、いくつかの集約関数です(私はそれを「予測されない値を選択する」と呼ぶ) – Dims

0

なし。 ONLY_FULL_GROUP_BY SQLモードが有効でない場合、GROUP BYの標準SQLの使用にMySQL allows

MySQLの拡張状態を有する、選択リストを許可、または列がない場合でも非集約列を参照するORDER BYリスト機能的にはGROUP BY列に依存します。これにより、MySQLは前述のクエリを受け入れます。この場合、サーバーは各グループから任意の値を自由に選択できるので、同じ値でないと選択された値は不確定です。これはおそらくあなたが望むものではありません。

このSQLモードは、デフォルトでrom v5.7.5でのみ有効です。

0

MySQLサーバーのバージョンを指定していないので、2つの可能な回答があります。

事前MySQL 5.7。5、上記のクエリは有効ですが、GROUP BYにリストされていないすべての列について次のコメントが集約されています。

サーバーは各グループから任意の値を自由に選択できます。選択された値は不定です。

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

のMySQL 5.7.5以降、この動作が変更され、MySQLはSQL99標準を実装したオプション機能のT301あたり

SQL99以降許すようnonaggregatesそれらが機能する場合GROUP BY

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

に依存

したがって、一部の列は有効ですが、すべての列がpatientID列に機能的に依存しているわけではありません(血液と皮膚の両方のサンプルが存在する可能性があるため)。

一般に、SELECT *を使用し、集約クエリ内のすべての結果カラムで何をするべきかを定義しないことは、悪い動作です。

TL; DR; MySQL 5.7.5以前ではクエリが実行され、結果は予測できません。5.7.5以降ではエラーが発生します。

関連する問題