Articles

MySQL::MySQL5.6リファレンスマニュアル::12.19.3GROUP BY

12.19.3GROUP BY

標準SQLでは、GROUP BYGROUP BY句で名前が付けられていないselectリスト内の非集計列を参照することはできません。GROUP BY句。 たとえば、選択リストの非集計nameGROUP BYに表示されないため、このクエリは標準SQLでは無効です: クエリを有効にするには、nameGROUP BY句で名前を付ける必要があります。 MySQLは、GROUP BYの標準SQL使用を拡張し、selectリストがGROUP BY句で名前が指定されていない集計されていない列を参照できるようにします。 これは、上記のクエリがMySQLで有効であることを意味します。 この機能を使用すると、不要な列の並べ替えやグループ化を回避することで、パフォーマンスを向上させることができます。 ただし、これは主に、GROUP BYORDER BYORDER BYは、サーバーが選択する各グループ内の値には影響しません。 同様のMySQL拡張機能がHAVING句に適用されます。 標準SQLでは、クエリはGROUP BYHAVING句の非集計列を参照できません。 計算を簡単にするために、MySQL拡張機能では、このような列への参照が許可されます。 この拡張では、グループ化されていない列のグループ単位の値が同じであることを前提としています。 それ以外の場合、結果は非決定的です。 MySQL拡張機能を無効にし、標準SQL動作を有効にするには、SQLモードを有効にします。ONLY_FULL_GROUP_BYGROUP BYHAVING句で使用できません。

選択リスト拡張はORDER BYGROUP BYORDER BYORDER BYONLY_FULL_GROUP_BYSQLモードが有効な場合は適用されません。 クエリに集計関数があり、GROUP BYHAVINGORDER BYONLY_FULL_GROUP_BY有効: P>

mysql> SELECT name, MAX(age) FROM t;ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)with no GROUP columns is illegal if there is no GROUP BY clause

GROUP BYname値があります。

mysql> SELECT name, MAX(age) FROM t;ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)with no GROUP columns is illegal if there is no GROUP BY clause

GROUP BYname値があります。

標準SQLに対する別のMySQL拡張では、HAVINGONLY_FULL_GROUP_BYnameordersONLY_FULL_GROUP_BYが有効であるかどうかに関係なく受け入れられます。

SELECT name, COUNT(name) FROM orders GROUP BY name HAVING COUNT(name) = 1;

次のクエリは、ONLY_FULL_GROUP_BYが無効である場合にのみ受け入れ 標準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);