SQL言語で使える集約関数(PostgreSQL編)

SQL言語で使える集約関数(PostgreSQL編)

目次

はじめに
集約関数とは
集約関数一覧
終わり

はじめに

最近、集約関数を改めて調べる機会があり、その中で知らない関数もあったので一度整理のため記事にしてみようと思います。
環境は以下で行いますので、もしかすると最新のPostgreSQLでは変更になっている部分もあるかと思いますので
その場合は公式ドキュメントを読んでいただければと思います。

環境
Windows10
PostgreSQL 9.5

集約関数とは

集約関数とはSQLの中で使用できる関数の一つで、「指定した列に対して、関連する全てのレコードで何らかの処理を行い、1つの値を出す」というものになります。
では実際に集約関数を使ってみたいと思います。

まず以下の給料テーブル「user_salary」があるとします。
salary列が給料で、length_of_service列が勤続年数を表します。


「user_salary」テーブル

このテーブルから一番高い給料は「500,000」なのは見て分かるかと思いますが、集約関数を使ってSQLで一番高い給料額を取得してみようと思います。
ここで使用する集約関数はMaxになります。

では実際のSQLが以下になります。

SELECT Max(salary) FROM user_salary

結果はこのようになります

Max関数は「Max(列名)」という使い方をし、括弧の中で指定した列の値で一番大きな値を持ってきます。
Min関数というのもあり、使い方はMaxと同じで、指定した列の値で一番小さな値を持ってきます。

もう一つ例として、Count関数を使ってみようと思います。
Count関数は名前の通り数を数える関数で、レコード数を数えるときによく使います。
ただ他の集約関数とは例外で列名を指定する代わりに「*」を使うこともできます。
実際にやってみると以下のようになります。

このように使用すると「user_salary」に保存されているレコードの数を取得することができます。
8つくらいなら数える事もできますが、レコード数が多くなると数え間違いも発生するのでそういったときに使用するのがよいかと思います。

集約関数一覧

集約関数は上記で上げたものの他にもありますが、色々あるのでとりあえず公式ドキュメントから一覧を引用しようと思います。

PostgreSQL 9.5.4文書  9.20. 集約関数

こうやってみると意外とあるんだなと感じます。
ちなみに統計処理用の集約関数もあるのですが、ご興味のある方は以下の公式ドキュメントのURLからご確認いただければと思います。
https://www.postgresql.jp/document/9.5/html/functions-aggregate.html

この中で個人的には業務システムで使えそうなものがあったので、最後にそれをピックアップして今回の記事は終わろうと思います。

その集約関数はString_Agg関数と言うものになります。
簡単に言うと、指定した列の値を全て文字列連結をしてくれるという便利なものになります。
早速実際に試してみると以下のようになります。

String_Agg関数は集約関数の中では珍しく2つの引数と取ります。
1つ目は他の集約関数と同様に列名を、2つ目は区切り文字を設定します。
そうすることで指定した列の値を全て区切り文字を使って文字列連結してくれます。

これの何が便利かといいますと、わざわざコード側で取得した結果をループして文字列連結する必要がなくなる点です。
新しいシステムだとDBのフレームワークがあって、そもそもSQLを書かないことも増えてきましたが、
まだまだ業務システムではSQLを書いている部分もあると思います。
その中でDBに保存されている文字列を連結したい場合に、コード側で書くと結構処理が遅かったりします。
そのときにString_Agg関数を使うと結構処理速度が改善されることもあるので、頭の片隅に置いてもらえればと思います。

終わり

個人的には集約関数はMax、Min、Count、Sum、Avgくらいしか知らず、String_Agg関数を知ったときにはこんな便利なものをもっと前から知っておきたかったなと思いました。
あまり書籍とかにも載っていない、もしくは一覧に載せてるくらいな関数なので知らない人も結構いるんじゃないかと思い書きました。
他にもまだまだ使えそうなものがあるかもしれないので、この機に色々な集約関数を使ってみてください。