データベース ・ Chapter 4
集計でまとまりの数字を出す
記事 ・ 冒頭を無料公開中
前の章では「条件に合う行」を取り出しました。この章で取り出すのは、行ではなく数字です——「ユーザーは何人か」「商品の平均価格は」「都市ごとに何人いるか」。1行1行を見るのではなく、行のまとまりを1つの数字に潰す。これを集計と呼びます。管理画面、売上レポート、ダッシュボード——実務のSQLで最も価値を生む領域です。
概要
usersに加えて、productsテーブル(商品)が登場します。ECサイトの商品棚です。
COUNT——数える
SELECT COUNT(*) FROM products;
COUNT(*) は「行が何件あるか」。SELECTの位置に列名ではなく集計関数を書くと、返ってくるのは表ではなく1つの数字(正確には、1行1列の表)になります。
▶ 実行してみよう
在庫切れの商品数——WHEREで絞ってから数えるという組み合わせです。前の章の道具はすべて集計と組み合わせられます。条件を price >= 3000 に変えるなどして、数字が変わることを確かめてください。
SUM / AVG / MAX / MIN——合計・平均・最大・最小
数える以外の集計関数も、使い方は同じです。カッコの中には対象の列を書きます。
| 関数 | 意味 |
|---|---|
| COUNT(*) | 行数 |
| SUM(列) | 合計 |
| AVG(列) | 平均 |
| MAX(列) | 最大値 |
| MIN(列) | 最小値 |
▶ 実行してみよう
複数の集計を1文で並べることもできます。AVGの結果が 4922.857142... のような小数で返ることにも注目してください(intの列でも平均は小数になります。丸めたい場合は ROUND(AVG(price)) で整数に丸められます——実行して試してください)。
集計とNULLの関係
usersテーブルで年齢の集計をしてみます。高橋さん(age NULL)はどう扱われるのか。
▶ 実行してみよう
結果を見比べてください——COUNT() は6、COUNT(age) は5。カッコに列名を入れると、NULLの行は数えられません。AVGも同じで、NULLを除いた5人の平均です(NULLを0として平均に混ぜたりはしない)。「集計関数はNULLを黙って除外する」——バグではなく仕様ですが、知らないと「人数が合わない」と混乱します。COUNT()とCOUNT(列)の違いは、面接の小テストにも出る定番です。
このチャプターの続きは受講生限定です
本文の残り、図解・実行できるコードブロック・演習はプラン加入後に読めます。