「データって、ただ眺めてるだけじゃ意味がないんです。」
たくさんの数字が並んでいるのに、なんとなく「情報っぽいけど、活用できてないな…」と感じたことはありませんか?
例えば、社員名簿を見ながら「この会社、平均年齢どれくらいなんだろう?」とか、売上データを見ながら「この商品の一番売れてる月っていつ?」なんて考えたこと、あるはず。
そんなときこそ、SQLの集計&統計クエリの出番です!
実は、データベースにちょっと話しかけるだけで、驚くほどスムーズに「知りたい答え」が返ってくるんですよ。
この記事では、初心者の方でもすぐに使える「SQLの集計&統計クエリ」を、手を動かしながら学べる形でご紹介します!
さあ、データの世界に飛び込んで、数字を“読む”楽しさを味わってみませんか?
データ分析って何?SQLでできることをざっくり解説
「データ分析って聞くと、なんか専門家だけの世界って感じがしませんか?」
でも、実は私たちの身の回りにもデータ分析の場面はあふれています。
たとえば——
- 「先月のブログPVってどれくらいだったっけ?」
- 「営業成績がいいのって、どの地域?」
- 「30代の社員って何人いるの?」
こういう「ちょっと知りたいこと」、全部がデータ分析のはじまりなんです!
データ分析って、具体的にどんなこと?
ざっくり分けると、こんなことを指します
ステップ | 内容 |
---|---|
データの取得 | 欲しい情報を集める(例:SELECT文など) |
集計 | 件数、平均、合計などを求める(COUNT, AVG など) |
比較・傾向の分析 | グループごとに比較したり、ランキングにする |
可視化(必要なら) | グラフや表にして「見える化」する |
SQLはこの中でも「データの取得・集計・比較」までを得意としています!
特に「データベースに入っている情報」に対しては、これ以上ないくらい強いです。
ExcelとSQLの違いって?
項目 | Excel(表計算) | SQL(データベース言語) |
---|---|---|
データ量 | 数千〜数万件が限界かも | SQL(データベース言語) |
操作方法 | 手動でポチポチ or 関数入力 | クエリ(命令文)を記述して操作 |
得意なこと | グラフ・可視化が得意 | 複雑な抽出・集計・組み合わせが得意 |
学習コスト | 少しとっつきやすい | 最初はコードに慣れる必要あり |
Excelが「紙の台帳」、SQLが「司令塔に指示を出すイメージ」です!
慣れればSQLのほうが、正確で、再利用しやすく、スマートに処理できます!
SQLで何ができるの?
「SQLってデータを取り出すだけじゃないの?」と思っていたそこのあなた。
実は、こんなことができます
- 顧客数・売上・在庫などの件数や合計を集計できる
- 部署別・地域別などグループごとの平均・最大・最小を分析できる
- 一番売れてる商品・一番若い社員などランキングやTOP◯の抽出もお手の物
- 年代別・性別・カテゴリ別などに分類して傾向を把握できる
つまり、「数字を意味ある形に変える力」=SQLの分析力なんです!
まとめ:SQLは“データと対話するツール”
SQLは難しい言語ではありません。
「このデータから何を知りたいのか?」を明確にして、その気持ちをクエリに変えるだけなんです。
次の章からは、実際にクエリを書きながら、 「あれ、私ちょっとデータ分析できてる…!」を一緒に体験していきましょう!
まずは基本の集計関数から!データをざっくり見てみよう
「なんだか大量のデータがあるけど、何がどうなってるのかよくわからない…」
そんなときに大活躍するのが、SQLの“集計関数”たちです!
この章では、以下の5つの基本的な集計関数を紹介します。
関数 | 意味 | よくある使いどころ |
---|---|---|
COUNT() | 件数を数える | レコード数、人数、件数をカウントしたいとき |
SUM() | 合計を計算する | 売上合計、金額の合計など |
AVG() | 平均値を求める | 平均年齢、平均金額など |
MIN() | 最小値を求める | 最年少、最低価格など |
MAX() | 最大値を求める | 最年長、最高金額など |
実例:社員データをざっくり分析してみよう!
例えば、こんなテーブルがあるとします
employees テーブル
name | age | salary |
---|---|---|
佐藤 | 28 | 320000 |
鈴木 | 35 | 410000 |
高橋 | 41 | 380000 |
この表から、「社員数・平均年齢・最低年齢・最高年齢」をまとめて見たいときはこう書きます
SELECT
COUNT(*) AS 社員数,
AVG(age) AS 平均年齢,
MIN(age) AS 最年少,
MAX(age) AS 最年長
FROM employees;
結果は
社員数 | 平均年齢 | 最年少 | 最年長 |
---|---|---|---|
3 | 34.6 | 28 | 41 |
なんとこの1行で、“どんな人たちが働いているのか”のざっくり全体像がつかめてしまいます!
会社の人事が見たら「お、若手多いじゃん」とわかるようになりますね。
売上データを使って、SUM() の威力を体感!
次は、ちょっと現場感のあるデータを使ってみましょう。
以下のような売上データがあるとします
sales テーブル
item | price |
---|---|
パン | 200 |
コーヒー | 300 |
サンドイッチ | 450 |
SELECT SUM(price) AS 合計売上 FROM sales;
結果:合計売上が 950円と表示されます。
小規模なカフェでも、日報を作るのにバッチリ使えそうですね!
ヒント:NULLには要注意!
実は、AVGやSUMなどの関数は、NULL(空欄)を計算対象に含みません!
「給料が未入力な人がいると平均が変わる」なんてこともあるので、データがちゃんと入っているかチェックする癖をつけておきましょう
ところで… COUNT(*) と COUNT(カラム名) の違いって?
SELECT COUNT(*) -- → レコード全体をカウント
SELECT COUNT(salary) -- → salaryがNULLじゃない行だけカウント
この違い、意外と見落とされがちです!
カラムを指定すると「値が入ってる行だけ」を数えるので、用途によって使い分けましょうね。
まとめ:まずは“全体をざっくり把握”する習慣を!
いきなり複雑な分析をする必要はありません。
SQLでデータのボリューム感や傾向をざっくり見ることが、分析の第一歩です。
次章では、ここで学んだ集計関数を、部署別・年代別などに“グルーピング”して集計していきますよ!
SQLの“情報整理術”、本領発揮です。
データをグループ化する!GROUP BYの基本
たとえば、社員データがどーんと並んでいたとして
—— 「部署ごとに社員数を数えたい」 「年代ごとに平均給与を出したい」 そんなときに登場するのが、GROUP BY(グループ・バイ)です!
これを使えば、データをまるで分類BOXに仕分けるようなイメージで整理できます!
GROUP BYって、どんなしくみ?
まずは基本の書き方
SELECT グループ分けしたい列, 集計関数(対象列)
FROM テーブル名
GROUP BY グループ分けしたい列;
例として、部署ごとの社員数を知りたいならこちら
SELECT department, COUNT(*) AS 社員数
FROM employees
GROUP BY department;
このクエリで、開発部には何人、営業部には何人…という“まとめ情報”が取れます!
いきなりベテラン人事担当のような目線ですね。
演習①:「部署ごとの平均年齢を出そう!」
SELECT department, AVG(age) AS 平均年齢
FROM employees
GROUP BY department;
このSQLで、部署ごとの“空気感”が見えてくる!
「この部署、やたら若い…新卒配属かな?」みたいな観察ができちゃいます。
応用:CASE式と組み合わせて、年代グループを作ろう!
SQLの魔法「CASE」と組み合わせれば、年齢から年代を算出して集計もできます。
SELECT
CASE
WHEN age BETWEEN 20 AND 29 THEN '20代'
WHEN age BETWEEN 30 AND 39 THEN '30代'
ELSE '40代以上'
END AS 年代,
COUNT(*) AS 人数
FROM employees
GROUP BY 年代;
結果は…
年代 | 人数 |
---|---|
20代 | 3 |
30代 | 4 |
40代以上 | 2 |
まるで「人材マーケティング視点」を手に入れたような気分になりますね。
よくあるミスあるある
- SELECT に GROUP BY対象以外のカラムを書いてエラーに → 使えるのは「グループ化した列」と「集計関数を使った列」だけ!
- GROUP BY の前に WHERE を入れる場合、順序に注意!
まとめ:GROUP BYを使えば「傾向」が見える!
- 個別データの「その人」ではなく、グループ全体の性質を捉える視点にステップアップ!
- ビジネス現場では「部門別」「地域別」「商品カテゴリ別」などGROUP BY大活躍です。
- あなたもデータを“上から俯瞰する視点”を手に入れてきましたよ…!
集計結果をフィルタリング!HAVINGの使い方
GROUP BYを使えば、部署ごとの人数や売上合計など「グループごとの傾向」が見えるようになりましたね。
でも、たとえばこんなことを考えたことはありませんか?
- 「社員数が10人以上の部署だけ表示したい」
- 「平均年齢が30歳以上のグループに絞りたい」
- 「合計売上が50万円超えの店舗だけ抽出したい」
…そう、集計したあとに“条件で絞り込む”ことがしたいんです!
そこで登場するのが、HAVING句 です!
HAVINGの基本構文
SELECT グループ列, 集計関数(列)
FROM テーブル名
GROUP BY グループ列
HAVING 集計関数(列) 条件;
ポイント
- WHERE は 集計“前”の個別データに条件をかける
- HAVING は 集計“後”のグループ結果に条件をかける
実践①:10人以上いる部署だけ表示したい
SELECT department, COUNT(*) AS 社員数
FROM employees
GROUP BY department
HAVING COUNT(*) >= 10;
このクエリでは、社員数が10人以上の部署だけが表示されます。
まるで「それなりに大所帯な部署だけ出して!」とお願いする感じですね。
実践②:平均給与が30万円以上の部署だけ
SELECT department, AVG(salary) AS 平均給与
FROM employees
GROUP BY department
HAVING AVG(salary) >= 300000;
給与の傾向で部署を比較するのも、HAVINGが得意とするところ!
「お、営業部って思ったより高給取りだな…」なんて気づきがあるかも。
よくある間違いあるある
-- ❌ エラー
WHERE COUNT(*) >= 10;
このように 集計関数をWHEREに使うとエラーになります。
WHEREはあくまで「集計する前の個々のデータ」に使うもの。
集計してから絞りたいときは、必ずHAVING を使いましょう!
WHEREとHAVING、どう使い分ける?
目的 | 使う句 |
---|---|
個々のデータで絞り込む | WHERE |
集計後の結果で絞り込む | HAVING |
両方必要なときは…? | 両方使える(WHERE→GROUP BY→HAVING の順) |
例えば「30歳以上の社員だけ集計し、その中から10人以上いる部署だけ表示したい」 そんなときはこんなふうに書きます
SELECT department, COUNT(*) AS 社員数
FROM employees
WHERE age >= 30
GROUP BY department
HAVING COUNT(*) >= 10;
まとめ:HAVINGは“集計の後に判断する”フィルター!
- WHEREは“データそのもの”への条件
- HAVINGは“集計結果に対する”条件
- 一緒に使うことで、高度なデータ分析ができるようになる!
これであなたも、SQLを使って「見たいグループだけを的確に抽出する」スキルを習得です!
順位・ランキングをつけてみよう!(ORDER BY & LIMIT)
たくさんのデータを見ていると、ふとこんなことを考えたくなりませんか?
「この中で一番年収が高い人は?」
「売上トップ5の商品は?」
「応募者の上位3名を表示したい!」
そんな願いを叶えるのが、ORDER BY と LIMIT のコンビです!
この章では、データの並び順を自在にコントロールする技術を習得していきます。
ORDER BYの基本構文
SELECT 列1, 列2
FROM テーブル名
ORDER BY 並べたい列 [ASC|DESC];
- ASC:昇順(小さい順)※省略可能!
- DESC:降順(大きい順)
実践①:年齢順に社員を並べてみよう!
SELECT name, age
FROM employees
ORDER BY age DESC;
このクエリを実行すると、年齢が高い順に社員がズラリと並びます。
会議室で「ベテラン勢がズラッと座っている」みたいな並びを想像してください。
逆に若い順に並べたいときは ASC を使いましょう
ORDER BY age ASC;
実践②:売上上位5商品を表示(LIMITで絞る)
SELECT item_name, sales
FROM products
ORDER BY sales DESC
LIMIT 5;
このクエリは、売上が多い順に5件だけ表示してくれます。
いわば「ランキング機能」。このコンボは本当に使いどころ満載です!
マーケティング担当さんにも好かれます。
実践③:複数の列で並べてみよう(セカンダリソート)
SELECT name, department, age
FROM employees
ORDER BY department ASC, age DESC;
こちらは「部署名の昇順 → 同じ部署内では年齢の高い順」で並べるパターン。
POINT:並び順に“優先順位”をつけられるので、 「部署ごとのベテラン」が一目でわかる並びになります!
LIMITとOFFSETで「◯件目から◯件」もできる!
SELECT name
FROM employees
ORDER BY age DESC
LIMIT 5 OFFSET 5;
このクエリは、「年齢順に並べた中の“6番目~10番目”を表示」します。
大量データから「2ページ目の5件」みたいな場面で便利です。
まとめ:ORDER BY & LIMITで、データに“表情”が出る!
- 順位やランキングを簡単に作れる
- 昇順/降順を使い分けて「上から見る/下から見る」ができる
- LIMITやOFFSETで、ページ分割・ピックアップも可能
これであなたも、SQLで「見せたい順番にデータを並べられる」スキルを手に入れました!
次は、いよいよ分類&条件分岐の花形:CASE文を使って、「分析しやすい形に整える」技術を学んでいきましょう!
データを分類して分析しやすく!CASEの活用
ここまでで、データを数える・まとめる・並べることができるようになりました。
…次なるスキルは、“分類(カテゴリ分け)”です!
例えば——
- 年齢を「20代・30代・40代」に分類したい
- 金額を「高・中・低」にランク分けしたい
- ステータスを「達成/未達成」で表示したい
そんなときに活躍するのが、CASE式(条件分岐)です。
まさにSQL版の「もし〜なら〜、そうでなければ〜」の構文!
CASEの基本構文
CASE
WHEN 条件 THEN 値1
WHEN 条件 THEN 値2
...
ELSE デフォルト値
END
この構文をSELECT文の中に書けば、任意の基準で分類された新しい列を作ることができます!
実践①:年齢を“年代カテゴリ”に分けてみよう
SELECT
name,
age,
CASE
WHEN age BETWEEN 20 AND 29 THEN '20代'
WHEN age BETWEEN 30 AND 39 THEN '30代'
ELSE '40代以上'
END AS 年代
FROM employees;
name | age | 年代 |
---|---|---|
佐藤 | 28 | 20代 |
鈴木 | 35 | 30代 |
高橋 | 44 | 40代以上 |
年齢 → 年代に変換するだけで、分析しやすさが一気にアップ!
グラフ化やレポートでも活用できますね。
実践②:給与額に応じて“収入ランク”をつけよう
SELECT
name,
salary,
CASE
WHEN salary >= 500000 THEN '高'
WHEN salary >= 300000 THEN '中'
ELSE '低'
END AS 給与ランク
FROM employees;
「金額」→「ランク」 にすると、表全体の傾向がパッと見えてきます。
マーケ施策や人材戦略の分析にも役立ちますよ。
CASE × GROUP BYでさらに分析的に!
せっかく作ったカテゴリ列、GROUP BYで集計もしてみましょう
SELECT
CASE
WHEN age < 30 THEN '20代'
WHEN age < 40 THEN '30代'
ELSE '40代以上'
END AS 年代,
COUNT(*) AS 人数
FROM employees
GROUP BY 年代;
これで、「どの年代が多いのか?」が一目で把握できます!
データの分類 → 可視化 → 戦略立案という、分析思考の流れに近づいてきましたね。
よくあるミス&注意点
- CASEの中で比較演算子(<, >=)などの条件を書き忘れると、ぜんぶ ELSE に流れます
- 複数のCASE式を組み合わせるときは、ENDでしっかり閉じるのを忘れずに!
まとめ:CASEは“データに意味をつける”魔法のツール!
- 生データにストーリーや意味を与える
- 分類することで「全体の構造」が見えてくる
- GROUP BYやHAVINGと組み合わせて深い分析も可能に!
次章では、ここまで学んだ集計・並べ替え・分類テクニックを組み合わせて、 実践的なクエリの設計や演習問題にチャレンジしていきましょう!
SQLでデータ分析をする楽しさを実感しよう!
ここまで、SQLによる集計・分類・並び替えなど、データ分析の基礎スキルをしっかり身につけてきました。
SELECT文をただ“読む”だけだった頃に比べて、今のあなたは… データに命令できる!問いかけられる!対話できる!
まさに、“数字を読み解く力”が手に入りつつある状態です。
SQLで分析できる世界は、まだまだ広い!
今回の記事では、以下のようなクエリをマスターしてきました
- COUNT, SUM, AVG, MIN, MAX といった集計関数
- GROUP BY によるグループごとの集計
- HAVING による集計後の絞り込み
- ORDER BY と LIMIT でランキングや順位づけ
- CASE 文でデータの分類やラベリング
これらを組み合わせれば、「部署別の平均給与を出し、30万円以上の部署だけを年齢順で表示」といった複合的なクエリも書けるようになります。
ここから先のステップは?
「もっと分析力を伸ばしたい!」という方には、こんなステップがおすすめです
ステップ | 内容 |
---|---|
ウィンドウ関数(OVER, RANKなど) | 順位・移動平均・累積など、さらに高度な分析が可能に! |
サブクエリ・共通テーブル式(CTE) | 複雑な条件や一時的なデータを駆使した処理が書けるように! |
可視化ツール(Tableau、Excel、Lookerなど)と連携 | SQL+グラフで、伝わる分析結果を! |
SQLで“見えなかったこと”が見えるようになる感覚
例えば、なんとなく売れてると思っていた商品が、月別集計で「実は3月だけ異常に売れてた」と判明したり、 営業成績が悪いと思っていた部署が、平均年齢が最年少と分かって「実はこれから伸びそう」と判断できたり。
SQLは、主観や感覚ではなく“数字で語れる自分”を育ててくれます。
これは一度体験すると、もう戻れない面白さです!
まとめ:「データが語りかけてくる瞬間」を楽しもう!
- SQLで分析できるようになると、「ちょっと見てみよう」がどんどん増えていく
- 知識よりも、“手を動かして身につけた感覚”が最大の財産になる
- 「分析って楽しいかも」と思えた今が、最高のスタート地点!
この記事が、あなたのSQLスキルの第一歩、そして“データと対話する力”の土台になったら嬉しいです!

「SQLでデータ分析なんて難しそう…」と思っていた方にも、少しでも「お、いけるかも?」と感じてもらえていたら嬉しいです。
分析って、特別なスキルじゃありません。 「ちょっと気になる」をクエリにしてデータに聞いてみる。 それだけで、数字が“語りだす”楽しさを味わえるようになります。
コメント