無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 11 関数と演算子 :: 11.11 GROUP BY 句との関数および修飾子の使用 :: 11.11.2 GROUP BY 修飾子
« 11.11.1 GROUP BY ( 集約 ) 関数

11.11.3 非常時フィールドとの GROUP BY および HAVING »
Section Navigation      [Toggle]
  • 11.11 GROUP BY 句との関数および修飾子の使用
  • 11.11.1 GROUP BY ( 集約 ) 関数
  • 11.11.2 GROUP BY 修飾子
  • 11.11.3 非常時フィールドとの GROUP BY および HAVING

11.11.2. GROUP BY 修飾子

GROUP BY 句は、 要約出力に行を追加する WITH ROLLUP 修飾子を許可します。これらの行は、高レベル ( または超集約 ) の要約演算を表します。したがって ROLLUP は、複数レベルでの解析で質問に単一クエリで答えることを可能にします。これは、例えば、OLAP ( Online Analytical Processing ) 演算へのサポートに使用することができます。

Sales と名付けられたテーブルが、売り上げの収益性を記録するために、year 、country 、product 、そして profit のカラムを持つ場合 :

CREATE TABLE sales
(
    year    INT NOT NULL,
    country VARCHAR(20) NOT NULL,
    product VARCHAR(32) NOT NULL,
    profit  INT
);

テーブルのコンテンツを、次のように簡単な GROUP BY で年ごとに要約することができます :

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 |        4525 |
| 2001 |        3010 |
+------+-------------+

この出力は各年の収益合計を表示しますが、すべての年にわたる収益合計を確認したい場合は、各値を自分で合計するか、別のクエリを実行する必要があります。

または、単一クエリで両方のレベルの解析を提供する ROLLUP を使用することもできます。GROUP BY 句に WITH ROLLUP 修飾子を加えると、クエリがすべての年にわたる総合計の値を示す行を生成します :

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 |        4525 |
| 2001 |        3010 |
| NULL |        7535 |
+------+-------------+

総合計の超集約ラインは、year カラムの値 NULL によって特定されます。

ROLLUP は、複数の GROUP BY カラムがある場合に、さらに複雑な効果をあらわします。この場合、「break」 ( 値の変更 ) が最後のグループ分けのカラムにある度に、クエリは追加の超集約要約行を生成します。

例えば、 ROLLUP なしの場合、year 、country 、そして product を基にした sales テーブルの要約はこのようになる場合があります :

mysql> SELECT year, country, product, SUM(profit)
    -> FROM sales
    -> GROUP BY year, country, product;
+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
| 2000 | USA     | Calculator |          75 |
| 2000 | USA     | Computer   |        1500 |
| 2001 | Finland | Phone      |          10 |
| 2001 | USA     | Calculator |          50 |
| 2001 | USA     | Computer   |        2700 |
| 2001 | USA     | TV         |         250 |
+------+---------+------------+-------------+

この出力は year/country/product レベルでのみの解析での要約値を示します。ROLLUP が加えられる時、クエリは複数の追加行を生成します :

mysql> SELECT year, country, product, SUM(profit)
    -> FROM sales
    -> GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | Finland | NULL       |        1600 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
| 2000 | India   | NULL       |        1350 |
| 2000 | USA     | Calculator |          75 |
| 2000 | USA     | Computer   |        1500 |
| 2000 | USA     | NULL       |        1575 |
| 2000 | NULL    | NULL       |        4525 |
| 2001 | Finland | Phone      |          10 |
| 2001 | Finland | NULL       |          10 |
| 2001 | USA     | Calculator |          50 |
| 2001 | USA     | Computer   |        2700 |
| 2001 | USA     | TV         |         250 |
| 2001 | USA     | NULL       |        3000 |
| 2001 | NULL    | NULL       |        3010 |
| NULL | NULL    | NULL       |        7535 |
+------+---------+------------+-------------+

このクエリでは、ROLLUP 句を加えると、ひとつでなく、よっつの解析のレベルでの要約情報が出力に含まれます。以下が ROLLUP 出力の解釈方法です :

  • 指定の year と country に対する product 行の各セットに続き、追加の要約行がすべての product の合計を示して生成されます。これらの行は NULL に対して product カラム セットを備えています。

  • 指定の year に対する product 行の各セットに続き、追加の要約行がすべての country と product の合計を示して生成されます。これらの行は NULL に対して country および products カラム セットを備えています。

  • そして最後に、他のすべての行に続き、追加の要約行がすべての year 、country 、および product の総合系を示して生成されます。この行は NULL に対して year 、country および products カラム セットを備えています。

ROLLUP を使用する際のその他の注意

次の項目は、ROLLUP の MySQL 実装特定の動作をリストしたものです :

ROLLUP を使用する場合、ORDER BY 句を同時に使用して結果をソートすることはできません。つまり、ROLLUP と ORDER BY は互いに排し合うということになります。しかし、ソートの順番をいくらかコントロールすることは可能です。MySQL の GROUP BY が結果をソートし、そして 明示的な ASC および DESC キーワードを GROUP BY 内で名付けられたカラムと使用し、各カラムのソート順を指定することができます。( しかし、ROLLUP によって加えられた高レベルな要約行は、ソート順に関わらず、それらが計算された行の後に現れます。)

LIMIT はクライアントに戻される行の数を限定するのに使用できます。LIMIT は ROLLUP の後に適用され、それによって ROLLUP によって追加された行に対しての制限が適用されます。例 :

mysql> SELECT year, country, product, SUM(profit)
    -> FROM sales
    -> GROUP BY year, country, product WITH ROLLUP
    -> LIMIT 5;
+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | Finland | NULL       |        1600 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
+------+---------+------------+-------------+

LIMIT を ROLLUP と使用すると、超集約行を理解するにはコンテキストが少ないため、より解釈が難しい結果を生成する場合があります。

各超集約行の NULL 指示子は、行がクライアントに送られた時に生成されます。サーバは、GROUP BY 句で名付けられたカラムを、変更値を持つ左側のものに続いて調査します。それらの名前に語彙がマッチした名称を持つ、結果セット内のすべてのカラムには、その値が NULL に設定されます。( カラム番号によってグループ分けのカラムを指定する場合、サーバは番号によってどのカラムを NULL に設定するかを確認します。)

超集約行の NULL 値は、クエリの処理の非常に遅い時点で結果セットに配置されるため、それらをクエリそのものの中で NULL 値としてテストすることはできません。例えば、クエリに HAVING product IS NULL を追加して、超集約行以外のすべての出力から除くことはできません。

一方、NULL 値はクライアント側には NULL として表れ、MySQL クライアント プログラミング インターフェイスのいずれかを使用してテストすることができます。

Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.