MySQLのWINDOW関数をCOUNTで試す

今日は久しぶりに長ズボンを履いた。寒かった。

開発環境

github.com

# ホスト
> 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関数使用時と比べると冗長な書き方に見える。

参考