PostgreSQLで,テーブルから抽出したデータを集約するときのSQLの書き方です.

目次

  1. 集約関数
    1. 合計
    2. 平均
    3. 最大・最小
    4. 個数
    5. 一意化した後で集約する場合
  2. グループに分ける(GROUP BY句)
  3. グループに条件を与える(HAVING句)
  4. ORDER BY句を使う場合の位置
  5. 参考文献

集約関数

集約関数は基本的にNULLを無視します.

合計

集約関数SUMにより,対象カラムの合計値を出せます.

SELECT SUM(カラム名) FROM テーブル名;

平均

集約関数AVGにより,対象カラムの平均を求めることができます.

SELECT AVG(カラム名) FROM テーブル名;

NULLが無視されるという集約関数の特性により,分母も適切に調整されます.

最大・最小

最大値と最小値を併記させるとすれば,次のように書きます.

SELECT MAX(カラム名), MIN(カラム名) FROM テーブル名;

辞書式順序も認めるので,文字列型や日付型にも使うことができます.

個数

集約関数COUNTでデータの個数を数えるには,

SELECT COUNT(カラム名) FROM テーブル名;

とします.
出力結果は,集約関数の性質によりNULLを除去した個数です.

COUNT(*)を用いると,例外的にNULLも含んだ個数を返します.

一意化した後で集約する場合

データを一意化した後で集約したい場合,集約関数の引数内でカラム名を修飾するようにDISTINCTを配置します.

SELECT COUNT(DISTINCT カラム名)

グループに分ける(GROUP BY句)

カラムを指定することで,そのカラムを断面としてデータを切り出します.
レコードはグループにまとめられてしまうので,SELECT句で指定できるのは定数と集約キー,集約関数のみに限られることになります.

SELECT 定数か集約キーか集約関数
FROM テーブル名
WHERE レコードに対する条件
GROUP BY 集約キーとなるカラム名

SELECT句でつけた別名は使えません.
グループ分けしてから集約関数の処理に入るので,SELECTで付ける別名にたどりついていないからです.

グループに条件を与える(HAVING句)

GROUP BY句で作ったグループに対して課す条件を書きます.
定数と集約キー,集約関数のみ使えます.

SELECT 定数か集約キーか集約関数
FROM テーブル名
WHERE レコードに対する条件
GROUP BY 集約キーとなるカラム名
HAVING グループに対する条件

HAVING句もGROUP BY句同様,SELECT句でつけた別名は使えません.

ORDER BY句を使う場合の位置

ORDER BY句が最後です.

SELECT 定数か集約キーか集約関数
FROM テーブル名
WHERE レコードに対する条件
GROUP BY 集約キーとなるカラム名
HAVING グループに対する条件
ORDER BY カラム名;

参考文献

SQLの方言に配慮しつつ,リレーショナルデータベースの操作を一から説明している入門書です.

  • ミック (2016)「SQL」第2版,翔泳社.