はじめに:エクセルから卒業し、SQLを駆使したデータ分析のプロフェッショナルへ
データ分析の現場では、日々膨大な量のデータが生成されています。特に、プロダクトマネージャーやデータアナリストの皆さんは、これらのデータを的確に処理し、有益な洞察を引き出すことが重要な業務となっているでしょう。しかし、エクセルでは限界があり、より強力なツールが必要です。
その最有力候補こそが、SQL(Structured Query Language)です。SQLは、データベースと対話し、データの抽出、加工、集計、分析を行うための標準言語として、世界中のデータ専門家に愛用されています。
実際に、多くの企業ではBigQueryやSnowflakeなどのデータウェアハウスでSQLを活用し、ビジネス戦略に不可欠な分析を行っています。また、TableauやLookerといったBIツールも、背景でSQLを使用しています。
この記事では、データ分析の初心者から中級者を目指す方々に向けて、SQLを使ったデータ分析を効率化するための5つの重要クエリを、実際の業務で使える具体的な例を交えながら詳しく解説します。
1. データの宝庫から必要な情報をピンポイントで抽出:SELECT文とWHERE句
データ分析の最初のステップは、目的とするデータをデータベースから抽出することです。SQLのSELECT文は、まさにそのための強力なツールです。
基本的な構文
SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件式;
各要素の役割は以下の通りです:
- SELECT 列名1, 列名2, …:抽出したい列を指定します
- FROM テーブル名:データが格納されているテーブルを指定します
- WHERE 条件式:抽出するデータを絞り込む条件を指定します

実際の業務での活用例
たとえば、ECサイトの顧客データベースから、特定の地域(例えば「東京都」)に住む顧客の氏名と年齢を抽出したい場合:
SELECT 氏名, 年齢
FROM 顧客テーブル
WHERE 地域 = '東京都';
さらに、WHERE句では様々な演算子を組み合わせて、より複雑な条件を指定できます:
- 比較演算子:=, !=, >, <, >=, <=
- 論理演算子:AND, OR, NOT
- その他演算子:LIKE, IN, BETWEEN, IS NULL, IS NOT NULL
高度な条件指定の例
20代(20歳以上30歳未満)の女性顧客で、かつ過去1年間に購入履歴がある顧客を抽出する場合:
SELECT *
FROM 顧客テーブル
WHERE 年齢 >= 20
AND 年齢 < 30
AND 性別 = '女性'
AND 最終購入日 >= DATE('2023-01-01');
このように、複数の条件を組み合わせることで、より精密なデータ抽出が可能になります。
2. データの海から価値ある洞察を引き出す:GROUP BY句と集計関数
抽出したデータを集計し、傾向やパターンを把握することは、データ分析において極めて重要です。SQLのGROUP BY句と集計関数を組み合わせることで、データをグループ化し、様々な角度から集計できます。
基本的な構文
SELECT 列名1, 集計関数(列名2), ...
FROM テーブル名
WHERE 条件式
GROUP BY 列名1;
主要な集計関数は以下の通りです:
- COUNT():件数を取得
- SUM():合計値を算出
- AVG():平均値を算出
- MAX():最大値を取得
- MIN():最小値を取得
実際のビジネス分析での活用例
地域ごとの顧客数を集計し、マーケティング戦略の基礎データを作成する場合:
SELECT 地域, COUNT(*) AS 顧客数
FROM 顧客テーブル
GROUP BY 地域;
また、地域ごとの平均年齢を算出し、ターゲット層を分析する場合:
SELECT 地域,
AVG(年齢) AS 平均年齢,
COUNT(*) AS 顧客数,
MAX(年齢) AS 最高年齢,
MIN(年齢) AS 最低年齢
FROM 顧客テーブル
GROUP BY 地域;
さらなる活用:HAVING句の使用
GROUP BY句と組み合わせて使用するHAVING句により、集計結果に対して条件を指定できます:
SELECT 地域, COUNT(*) AS 顧客数
FROM 顧客テーブル
GROUP BY 地域
HAVING COUNT(*) >= 100;
これにより、顧客数が100名以上の地域のみを抽出できます。
3. データの整理整頓:ORDER BY句とLIMIT句
集計結果を特定の順序で並べ替えたり、表示する件数を制限したりすることで、データをより見やすく、分析しやすくすることができます。
主要な機能
- ORDER BY句:指定した列の値でデータを並べ替える
- ASC:昇順(デフォルト)
- DESC:降順
- LIMIT句:表示する行数を制限する
実際の業務での活用例
地域ごとの顧客数を多い順に表示し、上位3地域を特定する場合:
SELECT 地域, COUNT(*) AS 顧客数
FROM 顧客テーブル
GROUP BY 地域
ORDER BY 顧客数 DESC
LIMIT 3;
また、売上データから月別の売上推移を分析する場合:
SELECT 年月,
SUM(売上金額) AS 月間売上,
COUNT(注文ID) AS 注文件数
FROM 売上テーブル
WHERE 年月 >= '2024-01-01'
GROUP BY 年月
ORDER BY 年月 ASC;
さらなる活用:OFFSET句との組み合わせ
大量のデータをページングして表示する際には、OFFSET句も活用できます:
SELECT 商品名, 売上金額
FROM 売上テーブル
ORDER BY 売上金額 DESC
LIMIT 10 OFFSET 20;
これにより、売上順位21位〜30位の商品を表示できます。
4. 複数のテーブルを繋ぎ合わせる:JOIN句

実際のビジネスデータは複数のテーブルに分散して保存されています。したがって、複数のテーブルのデータを組み合わせて分析することが必要になります。SQLのJOIN句を使うことで、共通の列をキーとして複数のテーブルを結合できます。
代表的なJOINの種類
- INNER JOIN:両方のテーブルにマッチするデータのみを取得
- LEFT JOIN:左側のテーブルのすべてのデータを取得
- RIGHT JOIN:右側のテーブルのすべてのデータを取得
- FULL JOIN:両方のテーブルのすべてのデータを取得
実際の業務での活用例
顧客テーブルと注文テーブルを結合し、顧客ごとの注文状況を分析する場合:
SELECT 顧客.氏名,
顧客.地域,
注文.注文ID,
注文.注文日,
注文.注文金額
FROM 顧客テーブル AS 顧客
INNER JOIN 注文テーブル AS 注文
ON 顧客.顧客ID = 注文.顧客ID
WHERE 注文.注文日 >= '2024-01-01';
より複雑な結合例
顧客、注文、商品の3つのテーブルを結合し、顧客ごとの購入商品カテゴリを分析する場合:
SELECT 顧客.氏名,
商品.カテゴリ,
COUNT(*) AS 購入回数,
SUM(注文.注文金額) AS 合計金額
FROM 顧客テーブル AS 顧客
INNER JOIN 注文テーブル AS 注文
ON 顧客.顧客ID = 注文.顧客ID
INNER JOIN 商品テーブル AS 商品
ON 注文.商品ID = 商品.商品ID
GROUP BY 顧客.氏名, 商品.カテゴリ
ORDER BY 合計金額 DESC;
このように、複数のテーブルを結合することで、より包括的なデータ分析が可能になります。
5. より高度なデータ抽出:サブクエリ
複雑な条件でデータを抽出したい場合は、サブクエリを使用します。サブクエリとは、クエリの中に埋め込まれたクエリのことで、入れ子構造にすることで、より高度な分析が可能になります。
基本的なサブクエリの例
平均年齢以上の顧客を抽出する場合:
SELECT *
FROM 顧客テーブル
WHERE 年齢 >= (SELECT AVG(年齢) FROM 顧客テーブル);
実際のビジネスでの活用例
売上上位10%の商品を購入した顧客を特定する場合:
SELECT 顧客.氏名, 顧客.地域
FROM 顧客テーブル AS 顧客
WHERE 顧客.顧客ID IN (
SELECT DISTINCT 注文.顧客ID
FROM 注文テーブル AS 注文
WHERE 注文.商品ID IN (
SELECT 商品ID
FROM 売上ランキング
WHERE ランキング <= (SELECT COUNT(*) * 0.1 FROM 商品テーブル)
)
);
EXISTS句を使用した高度な分析
特定の条件を満たす顧客のみを抽出する場合:
SELECT 顧客.*
FROM 顧客テーブル AS 顧客
WHERE EXISTS (
SELECT 1
FROM 注文テーブル AS 注文
WHERE 注文.顧客ID = 顧客.顧客ID
AND 注文.注文日 >= '2024-01-01'
AND 注文.注文金額 >= 10000
);
これにより、2024年以降に1万円以上の注文をした顧客のみを抽出できます。
実践的な活用シーン:データ分析プロジェクトでの応用

これまで解説した5つのクエリを組み合わせることで、実際のビジネスで求められる複雑な分析が可能になります。
ケーススタディ:ECサイトの月次売上分析
以下は、ECサイトの月次売上レポートを作成するクエリの例です:
SELECT
DATE_FORMAT(注文.注文日, '%Y-%m') AS 年月,
COUNT(DISTINCT 注文.顧客ID) AS アクティブ顧客数,
COUNT(注文.注文ID) AS 注文件数,
SUM(注文.注文金額) AS 月間売上,
AVG(注文.注文金額) AS 平均注文金額,
-- 前月比を計算するサブクエリ
(SUM(注文.注文金額) - LAG(SUM(注文.注文金額)) OVER (ORDER BY DATE_FORMAT(注文.注文日, '%Y-%m'))) / LAG(SUM(注文.注文金額)) OVER (ORDER BY DATE_FORMAT(注文.注文日, '%Y-%m')) * 100 AS 前月比
FROM 注文テーブル AS 注文
INNER JOIN 顧客テーブル AS 顧客
ON 注文.顧客ID = 顧客.顧客ID
WHERE 注文.注文日 >= '2024-01-01'
GROUP BY DATE_FORMAT(注文.注文日, '%Y-%m')
ORDER BY 年月 ASC;
このクエリにより、月別のKPI(重要業績指標)を一度に取得できます。
パフォーマンス最適化のポイント
大量のデータを扱う際は、以下の点に注意してクエリのパフォーマンスを向上させましょう:
- 適切なインデックスの活用:WHERE句やJOIN句で使用する列にインデックスを設定
- SELECT句の最適化:必要な列のみを取得し、SELECT *は避ける
- WHERE句の最適化:条件を適切に設定し、不要なデータの読み込みを避ける
- LIMIT句の活用:大量のデータを扱う際は、適切に件数を制限する
まとめ:SQLマスターへの道筋
この記事では、データ分析を効率化するための5つの重要クエリを、実際のビジネスシーンで使える具体例と共に詳しく解説しました。
学習した内容のまとめ
- SELECT文とWHERE句:データの精密な抽出
- GROUP BY句と集計関数:データの集計と洞察の抽出
- ORDER BY句とLIMIT句:データの整理と表示制御
- JOIN句:複数テーブルの結合による包括的分析
- サブクエリ:高度な条件設定による複雑な分析
これらのクエリを組み合わせることで、エクセルでは困難な大規模データの分析が可能になります。また、Google Analytics、Adobe AnalyticsなどのWebアナリティクスツールからのデータエクスポートと組み合わせることで、より高度な分析が実現できます。
次のステップへの提案
SQLの基礎をマスターした後は、以下のような発展的な学習を検討してみてください:
- ウィンドウ関数の活用による時系列分析
- CTE(Common Table Expression)を使った複雑なクエリの構造化
- ストアドプロシージャによる処理の自動化
- データベース設計の理論と実践
SQLは、データ分析において欠かせない強力な武器です。継続的な学習と実践により、データ分析のプロフェッショナルとしてのスキルを磨いていきましょう。