この記事の要点
- SQLは1974年誕生のリレーショナルデータベース操作言語で、半世紀にわたりデータ領域の共通言語であり続けている
- 基本構文はSELECT・WHERE・JOIN・GROUP BYの4つ。ここを押さえるだけで業務の大半はカバーできる
- 中級テクニックはCTEとウィンドウ関数。Excelのピボット相当の集計をSQL単体で完結できる
- PostgreSQL・MySQL・SQLite・SQL Server・Oracleは強みと用途が異なり、選定軸を理解する必要がある
- テック企業の面接ではJOINとウィンドウ関数の出題頻度が高く、実行計画の読解力も問われる
SQLとは何か
SQL(Structured Query Language)は、リレーショナルデータベースを操作するための標準言語だ。
| 項目 | 内容 |
|---|---|
| 誕生 | 1974年(IBM System R) |
| 標準化 | ANSI SQL(ISO/IEC 9075) |
| 主要RDBMS | PostgreSQL, MySQL, SQL Server, Oracle, SQLite |
| 用途 | データの取得・挿入・更新・削除・集計 |
| 学習曲線 | 基本は数時間、習熟には数ヶ月 |
SQLは「宣言的言語」だ。「どうやって取得するか」ではなく「何を取得したいか」を記述する。この特性がSQLを非エンジニアにも親しみやすいものにしている。
基本構文 — SELECT, WHERE, JOIN
SELECT — データの取得
SELECT title, published_at, status
FROM articles
WHERE status = 'published'
ORDER BY published_at DESC
LIMIT 10;
JOIN — テーブルの結合
SELECT a.title, c.name AS category
FROM articles a
JOIN categories c ON a.category_id = c.id
WHERE a.status = 'published';
集計関数
| 関数 | 用途 | 例 |
|---|---|---|
| COUNT() | 行数を数える | SELECT COUNT(*) FROM users |
| SUM() | 合計を求める | SELECT SUM(amount) FROM orders |
| AVG() | 平均を求める | SELECT AVG(price) FROM products |
| MAX() / MIN() | 最大/最小値 | SELECT MAX(salary) FROM employees |
| GROUP BY | グループ化 | SELECT category, COUNT(*) FROM articles GROUP BY category |
中級テクニック — サブクエリ、CTE、ウィンドウ関数
CTE(Common Table Expression)
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', created_at) AS month,
SUM(amount) AS total
FROM orders
GROUP BY 1
)
SELECT month, total,
LAG(total) OVER (ORDER BY month) AS prev_month
FROM monthly_sales;
ウィンドウ関数
| 関数 | 用途 |
|---|---|
| ROW_NUMBER() | 連番の付与 |
| RANK() / DENSE_RANK() | 順位付け |
| LAG() / LEAD() | 前後の行の値を取得 |
| SUM() OVER() | 累計計算 |
| NTILE(n) | n分割グループ化 |
ウィンドウ関数をマスターすると、ExcelのVLOOKUPやピボットテーブルで行っていた分析がSQLだけで完結する。
RDBMS比較 — どれを選ぶべきか
| RDBMS | 強み | ユースケース | ライセンス |
|---|---|---|---|
| PostgreSQL | 拡張性、JSON対応、標準準拠 | Webアプリ、分析基盤 | OSS(MIT相当) |
| MySQL | 高速、シンプル、広い採用実績 | Webアプリ、WordPress | OSS(GPL) |
| SQLite | 組み込み、サーバー不要 | モバイルアプリ、IoT | パブリックドメイン |
| SQL Server | Windows統合、BI連携 | エンタープライズ | 商用 |
| Oracle | 大規模トランザクション処理 | 金融、大企業基幹系 | 商用 |
2026年の新規プロジェクトでは、PostgreSQLが第一選択になることが多い。Supabase、Neon、Vercel Postgres等のマネージドサービスの充実も追い風だ。
パフォーマンス最適化
| テクニック | 効果 | 実装 |
|---|---|---|
| インデックスの適切な設計 | クエリ速度を10〜100倍改善 | CREATE INDEX idx_status ON articles(status) |
| EXPLAIN ANALYZE | ボトルネックの特定 | EXPLAIN ANALYZE SELECT ... |
| N+1問題の回避 | アプリ側のクエリ削減 | JOINまたはバッチ取得に変更 |
| 適切な正規化 | データ整合性の担保 | 第三正規形を基本に |
| パーティショニング | 大規模テーブルの分割 | 日付やIDでの範囲分割 |
SQL面接対策 — よく出る問題
テック企業のデータ系面接ではSQLは必出だ。
| 問題タイプ | 例 | ポイント |
|---|---|---|
| 集計系 | 「月別売上Top3を取得せよ」 | GROUP BY + ウィンドウ関数 |
| 結合系 | 「購入のないユーザーを取得せよ」 | LEFT JOIN + IS NULL |
| 時系列系 | 「7日間移動平均を計算せよ」 | ウィンドウ関数 + ROWS BETWEEN |
| 重複排除系 | 「最新の注文だけを取得せよ」 | ROW_NUMBER() + CTE |
半世紀を生き延びた言語の力
NoSQLの台頭、GraphQLの登場、AIによるクエリ自動生成——SQLの「終焉」は何度も予言されてきた。だがSQLは消えるどころか、Supabase、Prisma、dbt といったモダンツールの中核としてますます重要になっている。
あなたのデータは、まだExcelの中に眠ったままだろうか?
SQLを「体で覚える」ための練習
SQLの習得は、文法の暗記ではなく、手を動かして小さなクエリを書き続けることで体に染み込んでいく。
自分の持っているCSVや、公開されているサンプルDBを使って、毎日1〜2本のクエリを書く。
SELECTだけで終わらず、WHERE、JOIN、GROUP BY、サブクエリ、ウィンドウ関数と、週ごとに一段ずつ深めていく。
1ヶ月後には、業務のちょっとしたデータ抽出が自分の手で完結できるようになる。
SQLがキャリアに与える影響
エンジニアだけでなく、PM、マーケター、カスタマーサクセスの担当者も、SQLが書ける人とそうでない人で、意思決定のスピードと精度に差が出る。
データチームに毎回依頼するのではなく、自分で一次データを見にいく文化を持つ組織は強い。
SQLは、AI時代においても消えないベーシックなスキルの一つだ。
SQLと長期のキャリア
SQLのスキルは、時代が変わっても陳腐化しにくい基礎の一つだ。
データの形が変わっても、集計と抽出の考え方は普遍的だ。
AIがクエリを書いてくれる時代でも、そのクエリを読み、検証し、改善できる人が組織の中で重宝される。
SQLは、学びの初期投資が、長期的に効き続ける代表例だ。
データと対話する文化
SQLを触る人が増える組織では、データと対話する文化が自然に育つ。
会議の根拠、仮説の検証、意思決定の記録。
これらがデータに裏打ちされるだけで、議論の質は一段上がる。
導入5ステップ
ステップ1: ローカルDBで学習環境を構築
SQLiteやPostgreSQLをDockerで立ち上げ、サンプルデータを投入する。ブラウザ完結型の学習サイトだけでは身につかない操作感を早めに体験する。
ステップ2: SELECT/WHERE/JOINを手で書いて慣れる
基本3構文を繰り返し書く。LEFT JOINとINNER JOINの違い、NULL比較の挙動など、最初にハマりやすい箇所を意識的に踏んで覚える。
ステップ3: 集計とウィンドウ関数に踏み込む
GROUP BY、HAVING、ROW_NUMBER、LAG/LEADを扱えるようになると、分析クエリの8割はカバーできる。実データで「前月比」や「累積」を書くのが近道だ。
ステップ4: EXPLAINで実行計画を読む
クエリが遅いと感じたらEXPLAIN ANALYZEで実行計画を確認する。インデックスが効いているか、シーケンシャルスキャンが発生していないかを見る癖をつける。
ステップ5: 面接・実務のためのデータモデル理解
正規化、インデックス設計、トランザクション分離レベルなど、構文の外側にある概念を整理する。面接ではクエリより設計判断を問われるケースが増えている。
AIエージェント時代のSQL——「書く力」より「読み解く力」が重要に
2026年のSQLとの向き合い方は、5年前と決定的に違う。
Claude Code、Cursor、GitHub Copilotといったコーディングエージェントは、自然言語からSQLを生成する能力が劇的に向上している。Anthropicが2026年3月に公開したベンチマークでは、Claude Sonnet 4.5が複雑なJOINとCTEを含むクエリ生成タスクで人間の中級エンジニアを上回るスコアを記録した。
しかしこれは「SQLを学ばなくていい」という意味ではない。むしろ逆だ。AIが生成したクエリを「読み解いて検証できる人」と「鵜呑みにする人」の差が、組織への貢献度を分けるようになっている。
Mercariのデータエンジニアリングチームは2026年の社内勉強会レポートで「AIが書いたクエリの3割に、実行計画上の致命的な非効率が含まれていた」と報告している。生成されたSQLが意図通りのデータを返しているか、N+1問題を起こしていないか、インデックスが効いているか——これらを判定できるエンジニアは、AI時代にむしろ希少価値が上がる。
SQLを学ぶ意味は「自分で書くため」から「AIの出力を監督するため」へと、目的そのものが変質している。
よくある落とし穴——NULL・型・タイムゾーンの三大トラップ
SQL初心者が本番環境で事故を起こすパターンは、ほぼ3つに集約される。
第一はNULL処理だ。WHERE status != 'archived' と書くと、status が NULL の行は結果に含まれない。NULLは「比較不能」であり、= NULL も != NULL もどちらもfalseを返す。IS NULL / IS NOT NULL を使うか、COALESCE(status, '') != 'archived' のように明示的に変換する必要がある。
第二は暗黙の型変換だ。PostgreSQLは厳格だが、MySQLは WHERE id = '123abc' のような比較で文字列を数値に強制変換し、思わぬ結果を返すことがある。インデックスが効かなくなる原因にもなる。スキーマ設計時点で型を統一し、アプリ層からのパラメータバインディングを徹底するのが王道だ。
第三はタイムゾーン処理だ。TIMESTAMP 型と TIMESTAMP WITH TIME ZONE 型の違いを理解せずに本番運用すると、日次バッチが0時で動かず1時間ずれる、月次集計が月またぎで歪むといった事故が起きる。Supabaseは内部UTCで保存するため、フロントエンド表示のJST変換は必ずアプリ層で行うのが鉄則だ。
この3つを知っているだけで、SQL面接の落ちる原因の半分はカバーできる。
上級者向けの応用——分析関数と再帰CTEの実戦投入
SELECT/JOIN/GROUP BYに慣れたら、次に身につけるべきは分析関数と再帰CTEだ。
分析関数で頻出するのは「コホート分析」だ。ユーザーを登録月でグループ化し、その後の各月でどれだけ残存しているかを計算する。FIRST_VALUE() OVER (PARTITION BY user_id ORDER BY created_at) で初回購入月を取得し、DATE_DIFF で経過月を計算するクエリは、SaaS企業のデータチームで日常的に書かれている。
再帰CTE(WITH RECURSIVE)は、階層構造を扱う唯一の手段だ。組織図、カテゴリツリー、コメントスレッドのネスト——これらを単一クエリで全展開できる。リクルートやサイバーエージェントのデータ基盤チームが公開している事例では、商品カテゴリの多階層ツリーを再帰CTEで処理し、JOINの繰り返しによる性能劣化を回避している。
さらにPostgreSQL 16以降では、MERGE 文によるUPSERT処理、JSONB の演算子強化、ベクトル拡張pgvectorによるAI検索との統合も実用段階に入った。「SQLは枯れた技術」と言われながら、毎年新しい機能が追加され、できることの幅は確実に広がっている。
基礎を体に染み込ませたら、こうした応用領域に踏み込むことで、SQLは「最低限のスキル」から「差別化できる武器」へと変わっていく。
よくある質問
Q1. SQLの学習にどれくらいかかるか?
基本構文だけなら数時間で書けるようになる。ただし業務で通用するレベルまでには数ヶ月かかる。JOIN・サブクエリ・ウィンドウ関数・実行計画の読解までを段階的に習得するのが現実的な道筋である。
Q2. 最初に学ぶRDBMSはどれが良いか?
OSSで標準準拠が強いPostgreSQLが第一候補となる。学習素材が豊富で、JSON対応や拡張性もある。ローカル開発のみならSQLiteも選択肢に入る。商用RDBMSは業務で必要になってからで遅くない。
Q3. 面接ではどこが問われるか?
テック企業の面接ではJOINの種類・GROUP BYとHAVINGの違い・ウィンドウ関数を使った順位付けが頻出となる。加えてEXPLAINで実行計画を読み、インデックスの効き具合を説明できると評価が一段上がる。
