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の中に眠ったままだろうか?
