MySQL::MySQL5.6リファレンスマニュアル::12.19.3GROUP BY
12.19.3GROUP BY
標準SQLでは、GROUP BY
GROUP BY
句で名前が付けられていないselectリスト内の非集計列を参照することはできません。GROUP BY
句。 たとえば、選択リストの非集計name
GROUP BY
に表示されないため、このクエリは標準SQLでは無効です: クエリを有効にするには、name
GROUP BY
句で名前を付ける必要があります。 MySQLは、GROUP BY
の標準SQL使用を拡張し、selectリストがGROUP BY
句で名前が指定されていない集計されていない列を参照できるようにします。 これは、上記のクエリがMySQLで有効であることを意味します。 この機能を使用すると、不要な列の並べ替えやグループ化を回避することで、パフォーマンスを向上させることができます。 ただし、これは主に、GROUP BY
ORDER BY
ORDER BY
は、サーバーが選択する各グループ内の値には影響しません。 同様のMySQL拡張機能がHAVING
句に適用されます。 標準SQLでは、クエリはGROUP BY
HAVING
句の非集計列を参照できません。 計算を簡単にするために、MySQL拡張機能では、このような列への参照が許可されます。 この拡張では、グループ化されていない列のグループ単位の値が同じであることを前提としています。 それ以外の場合、結果は非決定的です。 MySQL拡張機能を無効にし、標準SQL動作を有効にするには、SQLモードを有効にします。ONLY_FULL_GROUP_BY
GROUP BY
HAVING
句で使用できません。
選択リスト拡張はORDER BY
GROUP BY
ORDER BY
ORDER BY
ONLY_FULL_GROUP_BY
SQLモードが有効な場合は適用されません。 クエリに集計関数があり、GROUP BY
HAVING
ORDER BY
ONLY_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 BY
name
値があります。
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 BY
name
値があります。
標準SQLに対する別のMySQL拡張では、HAVING
ONLY_FULL_GROUP_BY
name
orders
ONLY_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);
Leave a Reply