はじめに
集計関数とグループ化とUNIONについてのメモ
参考
集計関数
SUM、MAX、MIN、AVG
結果表が凸凹になってはいけない
- 日付は複数の日付で行が出力されるが、金額はSUMされているので、1つの行しか出力されないのでエラーになる
- 集計関数を使うと結果は必ず
1行
になる
select 日付, SUM(金額) From 家計簿
グループ化
- GROUP BY
- テーブルをグループに分割する
- select項目は定数、集約関数、GROUP BY で指定した列名しか指定できない
グループ化して集計する際の順番
SELECT 項目、集計関数
FROM テーブル
(WHERE 絞り込み条件)
GROUP BY 項目
検索(WHEREによる絞り込み) -> グループごとに検索結果を分類 -> 各グループを集計
複数の列によるグループ化
GROUP BY A、B
- まずAでグループ化して、Aはグループ化しているので、重複のない一意なものになる。
- このときにBはまだグループ化していないので、重複がある。
- 次に、そのグループ化したものに対して、Bでグループ化する。Bも重複のない結果表になり、AとBで一意な結果になる。
- すなわち、結果セットの中で、同じAとBの組み合わせを持つ行は1つだけになります。
元表
A | B | 値 |
---|---|---|
1 | 1 | 100 |
1 | 1 | 200 |
1 | 2 | 50 |
2 | 1 | 150 |
2 | 2 | 300 |
2 | 2 | 300 |
SELECT A, B, SUM(値) as 合計 FROM テスト GROUP BY A, B
結果表
AとBで一意な行だけが残る
A | B | 合計 |
---|---|---|
1 | 1 | 300 |
1 | 2 | 50 |
2 | 1 | 150 |
2 | 2 | 600 |
UNION
- SELECT文の結果セットをマージする(和集合)
- 各テーブルは列数とデータ型を一致させないといけない
- UNIONはテーブル同士を縦方向に連結。結合は横方向に連結
- 使いどころ
- 1つのテーブルに格納されたデータを複数の異なる条件で抽出したい場合
- 異なるテーブルでも、列数とデータ型を一致させていれば、1つのSQLで抽出できる
UNINONとUNION ALLの違い
UNION
と UNION ALL
の違いは、UNION が重複行の除去処理を行う点にあります。この重複行の除去処理がオーバーヘッドとなり得ます。一方、UNION ALL はこの処理を行わないため、原則として性能面で有利です。
SELECT文をネストする(サブクエリを使用する)場合
SELECT文をネストする(サブクエリを使用する)場合、最上位のSELECT文は通常サブクエリの結果セットをさらにフィルタリングや変換するために使用
-- サブクエリ内でUNIONを使って結果を結合し、その結果から特定の列を選択してフィルタリングする場合
SELECT SUM(columnA) FROM (
SELECT column1 AS columnA, column2 AS columnB FROM table1
UNION
SELECT columnA, columnB FROM table2
) AS subquery_alias;