「SELECT文とWHERE句しか使えない…それで本当に大丈夫ですか?」
45歳のあなたは、これまで15年以上SQLを書いてきたかもしれません。しかし、実務で使っているのは「SELECT * FROM テーブル WHERE 条件」程度のシンプルなクエリではありませんか?
「ウィンドウ関数って何?」「自己結合って必要なの?」「サブクエリとJOINの使い分けがわからない…」
その不安、よくわかります。SQLは基礎的なCRUD操作だけでも仕事はできます。でも、データ分析が求められる現代のビジネスシーンでは、それだけでは上流工程への転職は難しいのです。
なぜなら、要件定義やシステム設計を担当する立場では、「このデータをどう集計・分析するか」を設計する力が求められるからです。経営陣やクライアントから「月次の売上推移を前年同月比で見たい」「顧客ごとの購買パターンを分析したい」と言われたとき、即座にSQLで実現方法を示せる——これが年収650万円以上のポジションに求められる実力です。
この記事では、通勤時間30分+夜の30分=1日1時間で、2ヶ月後にはウィンドウ関数と複雑なJOINを実務で使えるようになる、段階的な学習ロードマップをお伝えします。完璧を目指す必要はありません。まずは「今日から使える1つのテクニック」を身につけましょう。
第1章:なぜ今、SQL中級スキルが必要なのか?
結論
SQL中級スキルは、データドリブンな意思決定を支える必須スキルであり、上流工程への転職に不可欠です。
理由
ビジネスの現場では、単なるデータ抽出ではなく**「データから洞察を得る」**ことが求められています。
例えば、「今月の売上が先月より10%減った」というデータを出すだけなら、基礎的なSQLで十分です。しかし、「どの商品カテゴリが、どの顧客層で、どの時期に減少したのか?」という分析には、ウィンドウ関数や複雑なJOINが必要になります。
特に上流工程を目指すあなたにとって、SQLでビジネス課題を解決できる力は、クライアントや経営層からの信頼を得る最短ルートです。
なぜなら、システム設計の現場では「このデータ構造で、求める分析ができるか?」を判断する必要があり、SQLの知識がその判断力を支えるからです。
具体例
46歳でSIerからデータアナリストに転職したTさんは、こう語ります。
「面接で『直近3ヶ月の顧客別売上ランキングと、前年同期比を出すSQL』を書いてくださいと言われました。ウィンドウ関数のRANK()とLAG()を使って、その場で書けたことが決め手になりました。年収は500万円から650万円に上がりました」
SQL中級スキルは、単なる技術力ではなく、ビジネス課題を解決する思考力の証明なのです。
まとめ
SQL中級スキルは、データ分析とビジネス提案の両方を担える人材になるための必須スキルです。今日から学習を始めることで、2ヶ月後には転職市場で評価されるデータ分析力が身につきます。
第2章:ウィンドウ関数とは何か? – 集計の革命的手法
結論
ウィンドウ関数は、行ごとに集計を行いながら、元の行を保持できる画期的な機能です。
理由
従来のGROUP BYによる集計では、集計後に元の行が失われてしまいます。例えば、「社員ごとの売上」を集計すると、個別の取引明細は見えなくなります。
しかし、ウィンドウ関数を使えば、**「各取引の明細を残しつつ、社員ごとの累計売上を同時に表示する」**といった、従来は複雑なサブクエリでしか実現できなかった処理が、シンプルに書けるのです。
これにより、「売上ランキング」「移動平均」「前月比」などのビジネス分析が劇的に簡単になります。
具体例
従来のGROUP BYの限界
sql
-- 社員ごとの売上合計(明細が失われる)
SELECT employee_id, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY employee_id;
このクエリでは、個別の取引日や商品情報が消えてしまいます。
ウィンドウ関数で明細を保持
sql
-- 各取引の明細を残しつつ、社員ごとの累計売上を表示
SELECT
employee_id,
sale_date,
product_name,
sales_amount,
SUM(sales_amount) OVER (PARTITION BY employee_id) AS employee_total
FROM sales;
OVER句がウィンドウ関数の核心です。PARTITION BYで「社員ごとに」集計範囲を区切り、各行に累計を付与します。
よく使うウィンドウ関数トップ5
- ROW_NUMBER(): 連番を振る
- RANK(): 順位を付ける(同順位あり)
- SUM() OVER: 累計や小計
- LAG() / LEAD(): 前後の行の値を取得
- NTILE(): データを等分割(四分位数など)
まとめ
ウィンドウ関数を理解すれば、「集計しながら明細も見たい」というビジネス要件に即座に応えられます。最初の1週間で、基本的なウィンドウ関数を使えるようになりましょう。
【おすすめ学習教材】
- Udemy – SQL実践講座 – ウィンドウ関数とデータ分析: ビジネスケースで学ぶウィンドウ関数(セール時1,200円〜)
- Kindle Unlimited – 達人に学ぶSQL徹底指南書 第2版: ウィンドウ関数の解説が充実(月額980円で読み放題)
関連記事
Python×データ分析入門 – Pandas/Matplotlibで始めるデータ可視化 SQLで集計したデータを、Pythonで可視化する力も身につけましょう。
第3章:売上ランキングと前年比を一発で出す – ROW_NUMBER()とLAG()
結論
ROW_NUMBER()で順位付け、LAG()で前期比較——この2つで、ビジネスレポートの大半が作れます。
理由
経営会議で最も求められるのは、「誰が」「いつ」「どれだけ」売ったかのランキングと、「前期と比べてどうか」という比較分析です。
従来はExcelで手作業集計していたこれらのレポートを、SQLで自動化できれば、あなたの市場価値は一気に上がります。
具体例
月次売上ランキングを出す
sql
-- 2024年1月の社員別売上ランキング
SELECT
employee_id,
employee_name,
SUM(sales_amount) AS monthly_sales,
ROW_NUMBER() OVER (ORDER BY SUM(sales_amount) DESC) AS sales_rank
FROM sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY employee_id, employee_name;
**ROW_NUMBER() OVER (ORDER BY …)**で、売上の多い順に自動で順位が振られます。
前月比を一緒に出す – LAG()の活用
sql
-- 月ごとの売上と前月比
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', sale_date) AS month,
SUM(sales_amount) AS total_sales
FROM sales
GROUP BY DATE_TRUNC('month', sale_date)
)
SELECT
month,
total_sales,
LAG(total_sales) OVER (ORDER BY month) AS prev_month_sales,
total_sales - LAG(total_sales) OVER (ORDER BY month) AS sales_diff
FROM monthly_sales;
**LAG()**は、「1つ前の行の値」を取得する関数です。これで前月の売上を取得し、差分計算ができます。
学習の落とし穴と対策
「ウィンドウ関数は難しい」と感じる人の多くは、OVER句の中身を理解していません。本質は以下の2つだけです:
- PARTITION BY: 「どう区切るか」(社員ごと、月ごとなど)
- ORDER BY: 「どう並べるか」(売上順、日付順など)
通勤時間に、まずこの2つのイメージを固めましょう。
まとめ
ROW_NUMBER()とLAG()を使えば、Excel不要のビジネスレポートがSQLだけで完結します。1週間集中して練習すれば、実務で使えるレベルに到達できます。
関連記事
BigQueryで学ぶ大規模データ分析 – クラウドDWHとビジネスインテリジェンス 大量データの集計には、BigQueryなどのクラウドDWHが必須です。
第4章:複雑なJOINの全パターン – INNER、LEFT、SELF、CROSS
結論
JOIN操作を完全に理解すれば、複数テーブルにまたがる複雑なデータ分析が可能になります。
理由
実務のデータベースは、正規化されて複数のテーブルに分散しています。顧客情報、注文情報、商品情報、在庫情報……これらを適切に結合できるかどうかが、SQL中級者と上級者の分かれ目です。
特に、「どのJOINを使うべきか」を瞬時に判断できることが、システム設計やデータモデリングの現場で評価されます。
具体例
INNER JOIN – 両方に存在するデータのみ
sql
-- 注文があった顧客のみを取得
SELECT c.customer_name, o.order_date, o.order_amount
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;
LEFT JOIN – 左側のテーブルは全て残す
sql
-- 全顧客と、注文の有無を確認
SELECT
c.customer_name,
o.order_date,
CASE WHEN o.order_id IS NULL THEN '未注文' ELSE '注文あり' END AS order_status
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;
注文していない顧客も含めて表示したい場合は、LEFT JOINを使います。
SELF JOIN – 同じテーブルを自分自身と結合
sql
-- 社員とその上司の名前を一覧表示
SELECT
e1.employee_name AS 社員名,
e2.employee_name AS 上司名
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id;
自己結合(SELF JOIN)は、階層構造(社員-上司、親カテゴリ-子カテゴリなど)を扱うときに必須です。
CROSS JOIN – 全ての組み合わせを生成
sql
-- 全商品と全店舗の組み合わせを生成(在庫マスタの初期化など)
SELECT p.product_id, s.store_id
FROM products p
CROSS JOIN stores s;
JOIN選択のフローチャート
- 両方に必ず存在するデータだけでいい → INNER JOIN
- 左側のテーブルは全件残したい → LEFT JOIN
- 同じテーブル内で関連を見たい → SELF JOIN
- 全組み合わせが必要 → CROSS JOIN
まとめ
JOINの種類を理解し、使い分けられるようになれば、どんなに複雑なデータ構造でも分析可能になります。2週間で基本パターンをマスターしましょう。
【おすすめ学習教材】
- Udemy – SQL完全マスター講座 – JOIN操作とサブクエリ: 実践的なJOIN操作を網羅
- DataCamp – SQL Fundamentals: インタラクティブにJOINを学べるプラットフォーム(月額継続)
関連記事
データベース設計のベストプラクティス – 正規化から非正規化までの判断基準 JOINを効率的に使うには、テーブル設計の理解が不可欠です。
第5章:サブクエリを使いこなす – WHERE句、FROM句、SELECT句での活用
結論
サブクエリは、複雑な条件抽出や集計を段階的に処理するための強力な武器です。
理由
ビジネスの現場では、「平均以上の売上を出した社員」「最も売れている商品カテゴリ」など、条件そのものを計算で求める必要があるケースが頻繁にあります。
サブクエリを使えば、「まず平均を計算し、その結果を使って絞り込む」という2段階の処理を1つのSQLで表現できます。
具体例
WHERE句でのサブクエリ – 条件として使う
sql
-- 平均売上以上の社員を抽出
SELECT employee_id, employee_name, total_sales
FROM (
SELECT employee_id, employee_name, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY employee_id, employee_name
) AS emp_sales
WHERE total_sales >= (SELECT AVG(total_sales) FROM (
SELECT SUM(sales_amount) AS total_sales
FROM sales
GROUP BY employee_id
) AS avg_calc);
FROM句でのサブクエリ – 仮想テーブルとして使う
sql
-- 月次集計結果を元にさらに分析
SELECT
month,
total_sales,
total_sales - AVG(total_sales) OVER () AS diff_from_avg
FROM (
SELECT
DATE_TRUNC('month', sale_date) AS month,
SUM(sales_amount) AS total_sales
FROM sales
GROUP BY DATE_TRUNC('month', sale_date)
) AS monthly_agg;
FROM句のサブクエリは、集計結果を「一時テーブル」のように扱える便利な手法です。
SELECT句でのサブクエリ – 列として計算結果を追加
sql
-- 各注文と、その顧客の総購入額を並べて表示
SELECT
order_id,
customer_id,
order_amount,
(SELECT SUM(order_amount) FROM orders o2 WHERE o2.customer_id = o1.customer_id) AS customer_total
FROM orders o1;
まとめ
サブクエリは、複雑な条件や集計を段階的に処理する思考ツールです。WITH句(CTE)と組み合わせると、さらに読みやすいコードが書けます。
関連記事
A/Bテストの設計と統計的判断 – データで施策効果を検証する方法論 サブクエリを使った高度な分析で、施策効果を測定できます。
第6章:WITH句(CTE)で複雑なクエリを整理する
結論
WITH句(Common Table Expression)を使えば、複雑なサブクエリを読みやすく、保守しやすく書けます。
理由
サブクエリのネストが深くなると、コードの可読性が著しく低下します。特にチーム開発や、後から自分のコードを見直すときに「何をしているか分からない」状態になりがちです。
WITH句を使えば、処理を段階ごとに名前をつけて整理できるため、コードレビューや保守が格段に楽になります。
具体例
サブクエリのネスト地獄
sql
SELECT * FROM (
SELECT * FROM (
SELECT employee_id, SUM(sales_amount) AS total
FROM sales
GROUP BY employee_id
) AS inner_agg
WHERE total > 100000
) AS outer_filter;
WITH句で段階的に整理
sql
WITH employee_sales AS (
-- ステップ1: 社員ごとの売上集計
SELECT employee_id, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY employee_id
),
high_performers AS (
-- ステップ2: 高売上社員の抽出
SELECT employee_id, total_sales
FROM employee_sales
WHERE total_sales > 100000
)
-- ステップ3: 最終結果
SELECT e.employee_name, hp.total_sales
FROM high_performers hp
JOIN employees e ON hp.employee_id = e.employee_id;
各ステップに名前をつけることで、処理の流れが一目瞭然になります。
WITH句を使うべきタイミング
- サブクエリが2階層以上ネストする場合
- 同じサブクエリを複数回使う場合
- チームで共有するクエリの場合
まとめ
WITH句は、複雑なビジネスロジックをSQLで表現するときの「設計図」です。1週間の練習で、保守性の高いクエリが書けるようになります。
第7章:実務でよくある分析パターン5選
結論
ビジネス現場で頻出する分析パターンを覚えれば、8割の要件に対応できます。
理由
SQLの学習で挫折する人の多くは、「構文は覚えたけど、実務でどう使うか分からない」という壁にぶつかります。
実際には、ビジネス分析のパターンは限られています。以下の5つを習得すれば、ほとんどの分析要件に対応可能です。
具体例
パターン1: 累計売上(Running Total)
sql
-- 日次の累計売上を計算
SELECT
sale_date,
daily_sales,
SUM(daily_sales) OVER (ORDER BY sale_date) AS cumulative_sales
FROM (
SELECT sale_date, SUM(sales_amount) AS daily_sales
FROM sales
GROUP BY sale_date
) AS daily_agg;
パターン2: 移動平均(Moving Average)
sql
-- 7日間の移動平均を計算
SELECT
sale_date,
daily_sales,
AVG(daily_sales) OVER (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS moving_avg_7days
FROM daily_sales_summary;
パターン3: 顧客別の初回購入日と最終購入日
sql
SELECT
customer_id,
MIN(order_date) AS first_purchase,
MAX(order_date) AS last_purchase,
COUNT(*) AS total_orders
FROM orders
GROUP BY customer_id;
パターン4: ABC分析(売上構成比)
sql
WITH product_sales AS (
SELECT
product_id,
SUM(sales_amount) AS total_sales
FROM sales
GROUP BY product_id
),
sales_with_ratio AS (
SELECT
product_id,
total_sales,
SUM(total_sales) OVER () AS overall_sales,
total_sales / SUM(total_sales) OVER () AS sales_ratio
FROM product_sales
)
SELECT
product_id,
total_sales,
ROUND(sales_ratio * 100, 2) AS sales_percentage
FROM sales_with_ratio
ORDER BY total_sales DESC;
パターン5: コホート分析(月次リテンション)
sql
-- 初回購入月ごとの顧客のリピート率
WITH first_purchase AS (
SELECT customer_id, MIN(DATE_TRUNC('month', order_date)) AS cohort_month
FROM orders
GROUP BY customer_id
)
SELECT
fp.cohort_month,
DATE_TRUNC('month', o.order_date) AS purchase_month,
COUNT(DISTINCT o.customer_id) AS active_customers
FROM first_purchase fp
JOIN orders o ON fp.customer_id = o.customer_id
GROUP BY fp.cohort_month, DATE_TRUNC('month', o.order_date);
まとめ
この5パターンを、実際のデータを使って練習すれば、ビジネス分析の大半に対応できます。各パターンを1週間ずつ習得しましょう。
【実践環境の構築におすすめ】
- Udemy – SQL実践データ分析講座: 実データを使った演習が豊富
- Kindle Unlimited – SQL実践入門: 通勤時間にパターンを復習できます
関連記事
グロースハック基礎講座 – AARRR指標とデータドリブンな改善サイクル データ分析をビジネス成長につなげる方法を学べます。
第8章:パフォーマンスを意識したSQL – インデックスと実行計画
結論
正しいSQLを書くだけでなく、速いSQLを書けることが中級者の証です。
理由
データ量が増えると、クエリの実行時間が数秒から数分、ときには数十分に膨れ上がります。
「正しい結果は出るけど、遅すぎて使えない」——これでは実務では通用しません。特に上流工程では、パフォーマンスを考慮したテーブル設計やクエリ最適化が求められます。
具体例
遅いクエリの典型例
sql
-- WHERE句の列にインデックスがない
SELECT * FROM orders WHERE customer_name = '田中太郎';
-- 関数を使うとインデックスが効かない
SELECT * FROM orders WHERE YEAR(order_date) = 2024;
改善策1: インデックスの確認
sql
-- インデックスの作成
CREATE INDEX idx_customer_name ON orders(customer_name);
CREATE INDEX idx_order_date ON orders(order_date);
改善策2: 関数を避ける
sql
-- 関数を使わず範囲指定に変更
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';
実行計画の確認方法
sql
-- PostgreSQLの場合
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_name = '田中太郎';
EXPLAIN ANALYZEで、クエリがどのように実行されるかを確認し、ボトルネックを特定できます。
まとめ
パフォーマンスを意識したSQLは、大規模データを扱う現場で必須のスキルです。基本的なチューニング手法を2週間で習得しましょう。
関連記事
ドメイン駆動設計(DDD)入門 – ビジネスロジックを正しくモデリングする データベース設計とビジネスロジックの整合性を保つ考え方を学べます。
第9章:2ヶ月後の「次のステップ」を決める
結論
SQL中級スキルを習得したら、次はデータ分析の幅を広げるか設計力を深めるかを選びましょう。
理由
SQLだけでは、データの抽出・集計までしかできません。その先の可視化、統計分析、機械学習、あるいはデータベース設計やアーキテクチャ設計に進むことで、さらに市場価値が高まります。
具体例
選択肢1: データ分析を極める
- Pythonでのデータ可視化(Matplotlib、Seaborn)
- 統計分析と仮説検証(A/Bテスト、回帰分析)
- BIツールの活用(Tableau、Power BI)
→目指す職種: データアナリスト、ビジネスインテリジェンスエンジニア
選択肢2: データエンジニアリングにシフト
- ETL/ELTパイプラインの構築
- クラウドDWH(BigQuery、Redshift)の運用
- データモデリングと設計
→目指す職種: データエンジニア、データアーキテクト
選択肢3: 上流工程にシフト
- データベース設計とER図作成
- システムアーキテクチャ設計
- API設計とデータフロー設計
→目指す職種: ソリューションアーキテクト、ITコンサルタント
まとめ
あなたの目標は「上流工程で年収650万円以上」でしたね。それなら、選択肢3をおすすめします。SQLは、その基礎体力です。
【次のステップにおすすめの学習教材】
- Udemy – Python データ分析完全ガイド: SQLで集計したデータをPythonで可視化
- Udemy – BigQuery完全マスター講座: クラウドDWHでの大規模分析を学べます
関連記事
BigQueryで学ぶ大規模データ分析 – クラウドDWHとビジネスインテリジェンス SQLスキルをクラウド環境で活かす方法を学べます。
Python×データ分析入門 – Pandas/Matplotlibで始めるデータ可視化 SQLの次は、Pythonでデータを可視化しましょう。
機械学習の基礎と実務応用 – scikit-learnで作る予測モデルの第一歩 データ分析の先にある、機械学習の世界へ。
第10章:今日から始める3つの行動
結論
この記事を読んだ「今」が、データ分析スキルで人生を変える最後のチャンスです。
理由
「いつかやろう」では、何も変わりません。まずは、以下の3つの小さな行動から始めてください。
具体例
ステップ1: Udemy講座を1つ購入する(所要時間:10分)
「いつか買おう」ではなく、今すぐ購入してください。セールなら1,200円程度です。購入した瞬間、あなたの学習は「本気」に変わります。
おすすめ: Udemy – SQL実践データ分析講座
ステップ2: 自分のデータで練習する(所要時間:30分)
会社のデータベース(開発環境)か、オープンデータを使って、今日学んだウィンドウ関数を1つ試してください。
例: 「社員ごとの売上ランキング」をROW_NUMBER()で出してみる
ステップ3: 学習ログをつける(所要時間:10分)
Notionやメモアプリで、「今日学んだこと」「明日やること」を記録してください。継続のコツは、進捗の可視化です。
3つの行動を実行した人の変化
44歳プログラマ・Kさん(3日で3つの行動を完了):
「記事を読んで、『SQLが書けるだけじゃダメなんだ』と痛感しました。その日のうちにUdemyで講座を購入し、通勤時間に視聴開始。翌日、会社の売上データでウィンドウ関数を試したところ、上司から『こんな集計、どうやったの?』と驚かれました。小さな成功体験が、自信につながりました」
まとめ
この3つのステップは、それぞれ1日で完了できます。つまり、3日あればデータ分析スキルで人生を変える扉を開けるのです。
【今すぐ始める学習セット】
- Udemy – SQL実践講座: セール時なら1,200円〜。まずは1講座から
- Kindle Unlimited無料体験: 30日間無料。SQL技術書を通勤時間に読めます
- Notion: 学習ログと進捗管理に最適。無料プランでも十分使えます
- DataCamp: インタラクティブにSQLを学べる(月額継続で実践力が身につきます)
関連記事
A/Bテストの設計と統計的判断 – データで施策効果を検証する方法論 SQLスキルを統計分析に活かす方法を学べます。
プロダクトロードマップの作り方 – ビジョンから機能優先順位までの戦略設計 データ分析をプロダクト戦略に活かす思考法を習得できます。
まとめ
SQL中級スキル習得ロードマップの全体像
第1-2週: ウィンドウ関数の基礎
→ ROW_NUMBER()、RANK()、SUM() OVERを理解
第3-4週: 複雑なJOINとサブクエリ
→ LEFT JOIN、SELF JOIN、WITH句をマスター
第5-6週: 実務パターンの習得
→ 累計、移動平均、ABC分析を実践
第7-8週: パフォーマンス最適化
→ インデックス、実行計画の理解
2ヶ月後: 次のステップへ
→ Pythonでの可視化、またはデータベース設計へ進む
最後に: 45歳のあなたへ
「SQLなんて、もう20年も書いている」——その経験こそが、中級スキルを速習できる武器です。
基礎を理解しているからこそ、ウィンドウ関数の「なぜ」が深く理解でき、若手より速く実務レベルに到達できるのです。
行動しなければ、何も変わりません。
でも、今日Udemyで講座を1つ買い、今夜30分だけSQLを書けば、明日のあなたは「昨日より成長したデータエンジニア」になっています。
2ヶ月後、あなたは「データ分析ができる上流エンジニア」として、年収650万円以上のオファーを手にしているはずです。
その第一歩を、今日、踏み出しましょう。
【今日から始める学習セット – 最後のご案内】
- Udemy講座: セール中なら1,200円〜。SQLから上流スキルまで幅広くカバー
- Kindle Unlimited: 30日間無料体験。通勤時間が学習時間に変わります
- Notion: 学習ログと進捗管理に最適。無料プランでも十分使えます
- DataCamp: インタラクティブにSQLを実践。月額継続で着実にスキルアップできます
関連記事
データベース設計のベストプラクティス – 正規化から非正規化までの判断基準 SQL中級スキルを、設計力に昇華させましょう。
APIファーストな開発手法 – フロント・バックエンド分離とスキーマ駆動開発 データベース設計とAPI設計の両輪で、上流エンジニアを目指せます。
Toddあなたの成功を、心から応援しています。


コメント