MySQL 8.0.1の新顔、GROUPING集約関数

TL;DR
WITH ROLLUPの結果行をHAVING条件に書けるようすることができる。 それ以外の時には使わない。
使い方。 そもそも WITH ROLLUP の使い方を知らないと楽しくもなんともないので WITH ROLLUP の説明から。
まずは WITH ROLLUP なしバージョン(SUM関数を噛ませてるのはあとで WITH ROLLUP した時のため)

おっと… GROUP BYが暗黙のソートをしなくなった件 を垣間見ることもできた。 5.7とそれ以前と出力結果を一緒にするためには、 ORDER BY Continent, Name も追加する必要がある。
ともあれ、こんなフツーの GROUP BY なクエリーに WITH ROLLUP を足してやると

こうなる。 Continent単位で合計したものが Name IS NULL として集約行が作られて、全てを合計した値で Continent IS NULL, Name IS NULL として集約行が作られる。
これ、NULLになったカラムはSQLの中から条件指定が不可能(WHEREはGROUP BYが処理される前のフィルターだし、HAVINGフィルターよりも更に後に集約行が作成されるのでダメらしい( MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.19.2 GROUP BY 修飾子
なので、この集約行にだけアクセスしたい場合(最初からそこでGROUP BYしろよとは思うけれどなんでなのか俺もやりたがった記憶がある)、アプリケーションの中で結果セットを受け取ってからカラムがNULLかどうかチェックして集約行判定をしなければならなかった。 たとえばこんな風に( !(defined($_->{Continent})) && !(defined(_->{Name}))

で、これをHAVINGの中で言及できるようにする関数が GROUPING らしい。

最初っからそこで GROUP BY しなよ感があるけれど、GROUPING が1か0を返すからORDER BYで集約行を先に持ってこられたらいいかな? と思った。

WITH ROLLUPとORDER BYが同時に使えないという制約があるので並べ替えには使えなかった。 残念。。

投稿日:April 12th 2017

元記事:http://yoku0825.blogspot.com/2017/04/mysql-801grouping.html

■サマリー

■画像

– PR –
– PR –