今日は久しぶりに長ズボンを履いた。寒かった。
開発環境
# ホスト > docker --version Docker version 20.10.8, build 3967b7d > docker-compose --version docker-compose version 1.29.2, build 5becea4c # コンテナ root@{CONTAINER_ID}:/# mysql --version mysql Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)
WINDOW関数とは
ウィンドウ関数は、一連のクエリー行に対して集計のような操作を実行します。 ただし、集計操作ではクエリー行が単一の結果行にグループ化されますが、ウィンドウ関数ではクエリー行ごとに結果が生成されます
https://dev.mysql.com/doc/refman/8.0/ja/window-functions-usage.html
集計関数にOVER句を付与するとWINDOW関数として使用できる。
今回は集計関数の一つであるCOUNTを使ってWINDOW関数を試す。
COUNT OVER
SELECT id, name, age, count(*) over() AS count FROM idol WHERE age = 17 ;
↓
+----+------------------+------+-------+ | id | name | age | count | +----+------------------+------+-------+ | 5 | 幽谷 霧子 | 17 | 7 | | 10 | 大崎 甜花 | 17 | 7 | | 11 | 大崎 甘奈 | 17 | 7 | | 13 | 園田 智代子 | 17 | 7 | | 15 | 西城 樹里 | 17 | 7 | | 20 | 浅倉 透 | 17 | 7 | | 21 | 樋口 円香 | 17 | 7 | +----+------------------+------+-------+
WINDOW関数を使わずに
SELECT id, name, age, ( SELECT COUNT(*) FROM idol WHERE age = 17 ) AS count FROM idol WHERE age = 17 ;
↓
+----+------------------+------+-------+ | id | name | age | count | +----+------------------+------+-------+ | 5 | 幽谷 霧子 | 17 | 7 | | 10 | 大崎 甜花 | 17 | 7 | | 11 | 大崎 甘奈 | 17 | 7 | | 13 | 園田 智代子 | 17 | 7 | | 15 | 西城 樹里 | 17 | 7 | | 20 | 浅倉 透 | 17 | 7 | | 21 | 樋口 円香 | 17 | 7 | +----+------------------+------+-------+
サブクエリを使ってみた。
WINDOW関数使用時と比べると冗長な書き方に見える。