無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 11 関数と演算子 :: 11.11 GROUP BY 句との関数および修飾子の使用 :: 11.11.3 非常時フィールドとの GROUP BY および HAVING
« 11.11.2 GROUP BY 修飾子

12 SQL ステートメント構文 »
Section Navigation      [Toggle]
  • 11.11 GROUP BY 句との関数および修飾子の使用
  • 11.11.1 GROUP BY ( 集約 ) 関数
  • 11.11.2 GROUP BY 修飾子
  • 11.11.3 非常時フィールドとの GROUP BY および HAVING

11.11.3. 非常時フィールドとの GROUP BY および HAVING

MySQL は GROUP BY の使用を拡張し、GROUP BY 句には現れない SELECT リストでの、超集約カラムまたは計算の使用を可能にします。この機能を利用して、不要なカラムのソートやグループ分けを避けることで、性能を改善することができます。例えば、次のクエリでは、customer.name のグループ分けをする必要がありません :

SELECT order.custid, customer.name, MAX(payments)
  FROM order,customer
  WHERE order.custid = customer.custid
  GROUP BY order.custid;

標準 SQL では、GROUP BY 句に customer.name を加える必要があります。MySQL では、この名前は二重化しています。

GROUP BY 部から省略したカラムがグループ内で一定していない場合は、この機能を 使用しないで ください。サーバはいかなる値もグループから自由に戻すことができ、すべての値が同じでない限り、結果は不確定です。

同様の MySQL 拡張機能が HAVING 句に適用されます。SQL の基準では、GROUP BY 句で検出されないカラムで、集約関数で囲まれていないものを、 HAVING 句で名付けることはできません。MySQL では、それらのカラムで計算を簡易化することができます。この拡張は、グループ分けされていないカラムが、同じグループに関する値を持っていることを前提としています。それ以外では、結果は不確実になります。

ONLY_FULL_GROUP_BY SQL モードが有効になっている場合、GROUP BY への MySQL 拡張は適用されません。これは、GROUP BY 句で名付けられていないカラムは、集約関数で使用されていない場合、SELECT リスト、または HAVING 句で利用することができません。

選択リストの拡張も、ORDER BY に適用できます。つまり、GROUP BY 句に表れない ORDER BY 句の非集約カラムまたは計算を使用することができます。この拡張は、ONLY_FULL_GROUP_BY SQL モードが有効になっている時は適用しません。

いくつかのケースでは、MIN() および MAX() を使用して、ユニークなもの意外でも特定のカラム値を取得することができます。次の例は、sort カラムでの最小値を含む行からの column の値を与えます :

SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)

The Rows Holding the Group-wise Maximum of a Certain Field 参照。

標準 SQL に準じる場合は、GROUP BY 句で式を使用することはできないのでご注意ください。式にエイリアスを使用することで、この制限を回避することが可能です :

SELECT id,FLOOR(value/100) AS val
  FROM tbl_name
  GROUP BY id, val;

MySQL は GROUP BY 句での式の使用を許可していません。例 :

SELECT id,FLOOR(value/100)
  FROM tbl_name
  GROUP BY id, FLOOR(value/100);
Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.