データベース ・ 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(列)の違いは、面接の小テストにも出る定番です。

このチャプターの続きは受講生限定です

本文の残り、図解・実行できるコードブロック・演習はプラン加入後に読めます。

料金プランを見る