標準SQLでは,集团
句を含むクエリは,集团
句で名前が指定されていない選択リスト内の非集約カラムを参照できません。たとえば,このクエリ,は,選択リスト内の的名字
カラムが集团
に表示されていないため,標準SQLでは不正です。
SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid;
このクエリを正当にするには,的名字
カラムを選択リストから削除するか,集团
句で名前を指定する必要があります。
MySQLでは,選択リストが集团
句で名前が指定されていない非集約カラムを参照できないように,集团
の使用が拡張されています。まり,上記のクエリーは MySQL では正当です。この機能を使用すると、不要なカラムのソートおよびグループ化が回避されるため、パフォーマンスを改善できます。ただし、これは主に、集团
で名前が指定されていない各非集約カラム内のすべての値がグルプごとに同じである場合に役立ます。サバは各グルプから任意の値を自由に選択できるため,同じ値でなければ,選択した値は不確定です。さらに,命令
句を追加しても,各グルプからの値の選択が影響を受ける可能性はありません。値が選択されたあとに結果セットのソトが発生しますが,命令
によって,サバで選択された各グルプ内の値は影響を受けません。
同様のMySQL拡張が有
句に適用されます。標準SQLでは,集团
句を含むクエリは,集团
句で名前が指定されていない有
句の非集約カラムを参照できません。MySQL拡張では、計算を簡単にするために、このようなカラムへの参照が許可されます。この拡張では、グループ化されていないカラムに同じグループに関する値が含まれると仮定されます。それ以外の場合は、結果が不確定です。
MySQL集团
の拡張を無効にするには,ONLY_FULL_GROUP_BY
SQLモドを有効にします。これにより,標準SQLの動作が有効になります。集团
句で名前が指定されていないカラムは,集約関数で囲まなければ,選択リストまたは有
句で使用できません。
また,ONLY_FULL_GROUP_BY
によって,有
句のエ邮箱リアスの使用も影響を受けません。たとえば,次のクエリ,は,订单
テブルで1回だけ発生する的名字
値を返します。
SELECT name, COUNT(name) FROM orders GROUP
MySQLでは,集約カラム用に有
句でエリアスを使用することが許可されるように,この動作が拡張されています。
SELECT name, COUNT(name) AS c FROM orders GROUP BY name
ONLY_FULL_GROUP_BY
を有効にすると,このMySQL拡張が無効になり,有
句のc
カラムが集約関数で囲まれていないため(これは,集約関数です)、非分组字段“c”用于HAVING子句
というエラが発生します。
選択リストの拡張は,命令
にも適用されます。まり,集团
句に表示されていない命令
句の非集約カラムは参照できません。(ただし,すでに説明したように,命令
によって,非集約カラムからどの値が選択されるのかは影響を受けません。選択されたあとにはじめてソートされます)。ONLY_FULL_GROUP_BY
SQLモドが有効になっている場合は,この拡張が適用されません。
一部のケスでは,MIN ()
およびMAX ()
を使用すると,一意でない場合でも特定のカラム値を取得できます。排序
カラムに6桁以内の整数が含まれている場合,次のクエリ,は,最小の排序
値を含む行から列
の値を取得します。
SUBSTR (MIN (CONCAT (LPAD(“0”),6日,列)),7)
セクション3.6.4 "特定のカラムのグルプごとの最大値が格納されている行"を参照してください。
標準SQLに従おうとすると,集团
句で式を使用できません。回避策として、式のエ以及リアスを使用します。
SELECT id, FLOOR(值/100)AS val FROMtbl_nameGROUP BY id, val;
MySQLでは,集团
句で式を使用することが許可されているため、エ以及リアスは必要ありません。
SELECT id, FLOOR(value/100) FROMtbl_nameGROUP BY id, FLOOR(值/100);