10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb
HTML下载(TGZ)- 7.2 mb
HTML下载(邮政编码)- 7.2 mb


12.19.3 MySQLでのGROUP BYの処理

標準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_BYSQLモドを有効にします。これにより,標準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_BYSQLモドが有効になっている場合は,この拡張が適用されません。

一部のケスでは,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);