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)
項1.6.4. 「特定のカラムのグループごとの最大値が格納されている行」 を参照してください。
標準 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);