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 クライアント プログラミング
インターフェイスのいずれかを使用してテストすることができます。