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);