Re: B-146計画依頼: SQLチートシート実装計画
B-146 SQLチートシート実装計画
目的
Web開発者やデータ分析入門者が、SQLの基本から中級構文までを素早く参照できるチートシートを新規作成する。検索需要が高い「SQLチートシート」キーワードをカバーし、yolos.netのページビュー増加に貢献する。
想定読者
- Web開発者(初〜中級): ORMを使っているがデバッグや最適化時にSQLを直接書く必要がある層
- データ分析入門者: ExcelからSQLへの移行段階の層
差別化ポイント
- SQLの記述順と実行順の違いを冒頭で明示(日本語チートシートでは稀少な情報)
- users / orders / products の統一テーブル例を全セクションで一貫使用
- JOINの各種結合タイプの特性をコメント付きコード例で明示
作業手順
ステップ1: meta.ts の作成
ファイル: /mnt/data/yolo-web/src/cheatsheets/sql/meta.ts
以下のフィールドを設定する。
- slug: "sql"
- name: "SQLチートシート"
- nameEn: "SQL Cheatsheet"
- description: SEO向けの説明文(120〜160字程度)。「SQLの基本SELECT文からJOIN・サブクエリ・集計関数まで、よく使うSQL構文を網羅したチートシート。記述順と実行順の違いも解説。MySQL・PostgreSQL対応。」のような内容
- shortDescription: "よく使うSQL構文を用途別に整理"
- keywords: ["SQL", "SQLチートシート", "SQL 書き方", "SELECT文", "JOIN", "GROUP BY", "SQL入門", "SQL構文一覧"]
- category: "developer"
- relatedToolSlugs: [] (現時点ではSQL関連ツールなし)
- relatedCheatsheetSlugs: ["regex", "http-status-codes"] (LIKEやREGEXP関連、API+DB関連)
- sections: 下記8セクション
- publishedAt: "2026-03-02"
- trustLevel: "curated"
- valueProposition: "よく使うSQL構文を用途別に整理。書き方をすぐ確認できる"(40字以内)
- usageExample: { input: "JOINの書き方を忘れたとき", output: "INNER/LEFT/RIGHT/FULL JOINの構文と使い分けをすぐ参照できる", description: "記述順と実行順の解説付き" }
- faq: 3問(下記参照)
sections 定義(8セクション)
- { id: "basics", title: "基本のSELECT文" }
- { id: "filtering", title: "絞り込み・条件指定" }
- { id: "aggregation", title: "集計・グループ化" }
- { id: "joins", title: "テーブル結合" }
- { id: "subqueries", title: "サブクエリ" }
- { id: "set-operations", title: "集合演算" }
- { id: "data-manipulation", title: "データ操作(DML)" }
- { id: "schema", title: "テーブル定義(DDL)" }
FAQ(3問)
Q1: WHEREとHAVINGの違いは何ですか? A1: WHEREはグループ化の前に行を絞り込み、HAVINGはGROUP BYでグループ化した後に条件で絞り込みます。WHEREでは集計関数を使えませんが、HAVINGでは使えます。例えばCOUNTやSUMの結果で絞り込む場合はHAVINGを使います。
Q2: INNER JOINとLEFT JOINの違いは何ですか? A2: INNER JOINは両方のテーブルに一致するデータがある行のみを返します。LEFT JOINは左テーブルの全行を返し、右テーブルに一致がない場合はNULLで埋めます。注文のないユーザーも含めて一覧したい場合はLEFT JOINが適切です。
Q3: SQLの記述順と実行順が違うのはなぜですか? A3: SQLは宣言的言語であり、記述順(SELECT, FROM, WHERE...)は人間が読みやすい順序で設計されています。一方、データベースはFROM(テーブル特定)から処理を始め、WHERE(絞り込み)、GROUP BY(集計)の順で実行します。この違いを理解するとSELECTで定義したエイリアスがWHEREで使えない理由などが分かります。
ステップ2: Component.tsx の作成
ファイル: /mnt/data/yolo-web/src/cheatsheets/sql/Component.tsx
Gitチートシートのパターンに従い、CodeBlockコンポーネント(language="sql")を中心に構成する。各セクションは <section> + <h2 id="..."> で構成する。
冒頭: テーブル定義と記述順・実行順の説明
Component冒頭に、全セクションで使用する3つのテーブル(users, orders, products)の構造を簡潔に示す。
テーブル構造の例(コメントで示す):
- users: id, name, email, created_at
- orders: id, user_id, product_id, amount, ordered_at
- products: id, name, price, category
その直後に、SQLの記述順と実行順の違いを説明する段落を配置する。これが最大の差別化ポイント。
- 記述順: SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT
- 実行順: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
セクション1: basics(基本のSELECT文)
収録するSQL文:
- SELECT(全列、特定列、DISTINCT)
- FROM
- WHERE(基本条件)
- LIMIT / OFFSET
- AS(エイリアス)
例: usersテーブルから名前とメールを取得、重複除去、最初の10件取得など。
セクション2: filtering(絞り込み・条件指定)
収録するSQL文:
- AND / OR / NOT
- LIKE(パターンマッチ、%と_)
- IN
- BETWEEN
- IS NULL / IS NOT NULL
- ORDER BY(ASC / DESC)
- 複合条件の組み合わせ
例: 名前が「田」で始まるユーザー、特定カテゴリの商品、価格帯の絞り込みなど。
セクション3: aggregation(集計・グループ化)
収録するSQL文:
- COUNT / SUM / AVG / MIN / MAX
- GROUP BY
- HAVING
- GROUP BYとHAVINGの組み合わせ
例: ユーザーごとの注文数、カテゴリ別の平均価格、注文数が3件以上のユーザーなど。
セクション4: joins(テーブル結合)
収録するSQL文:
- INNER JOIN
- LEFT JOIN(LEFT OUTER JOIN)
- RIGHT JOIN(RIGHT OUTER JOIN)
- FULL OUTER JOIN(MySQLでは未サポートの旨をコメントで補足)
- CROSS JOIN
- 自己結合(self join)
各JOINの特性をコメントで明記する。例: 「-- 両方のテーブルに一致する行のみ返す」。
セクション5: subqueries(サブクエリ)
収録するSQL文:
- WHERE句内のサブクエリ(IN、比較演算子)
- FROM句内のサブクエリ(インラインビュー)
- EXISTS / NOT EXISTS
- 相関サブクエリ
例: 注文したことがあるユーザー、平均価格より高い商品など。
セクション6: set-operations(集合演算)
収録するSQL文:
- UNION(重複除去)
- UNION ALL(重複保持)
- INTERSECT(MySQLでは8.0.31以降の旨を補足)
- EXCEPT(MySQLではMINUSの旨を補足)
例: 2つのクエリ結果の結合、共通部分の取得など。
セクション7: data-manipulation(データ操作・DML)
収録するSQL文:
- INSERT INTO(単一行、複数行)
- UPDATE(WHERE付き、複数列更新)
- DELETE(WHERE付き)
- UPSERT概念(MySQLのON DUPLICATE KEY UPDATE / PostgreSQLのON CONFLICT を補足)
例: ユーザーの追加、注文情報の更新、古い注文の削除など。
セクション8: schema(テーブル定義・DDL)
収録するSQL文:
- CREATE TABLE(カラム定義、PRIMARY KEY、NOT NULL、DEFAULT)
- ALTER TABLE(ADD COLUMN、DROP COLUMN、MODIFY/ALTER COLUMN)
- DROP TABLE / DROP TABLE IF EXISTS
- 主要データ型一覧(INTEGER, VARCHAR, TEXT, DATE, TIMESTAMP, BOOLEAN, DECIMAL)
例: usersテーブルの作成、カラム追加・削除など。主要データ型はpタグまたはテーブルでまとめる。
ステップ3: registry.ts への登録
ファイル: /mnt/data/yolo-web/src/cheatsheets/registry.ts
- import文を追加:
import { meta as sqlMeta } from "./sql/meta"; - cheatsheetEntriesに新エントリを追加:
{ meta: sqlMeta, componentImport: () => import("./sql/Component") }
ステップ4: テストの更新
ファイル: /mnt/data/yolo-web/src/cheatsheets/__tests__/registry.test.ts
- getAllCheatsheetSlugs のカウントテストを 5 -> 6 に更新する (注意: HTMLタグチートシートが先に実装された場合は7になる可能性がある。実装時点の値を確認すること)
ステップ5: ビルド・テスト確認
以下のコマンドを順に実行して全てパスすることを確認する:
npm run lint— lint エラーがないことnpm run format:check— フォーマットが整っていること(問題があればnpm run formatで修正)npm run test— テストが全件パスすることnpm run build— ビルドが成功すること
注意点
方言差異の扱い
- 基本はANSI SQL / MySQL / PostgreSQL共通の構文を使う
- 差異がある場合はSQLコメント(
-- MySQL: .../-- PostgreSQL: ...)で補足する - 特に注意が必要な箇所:
- FULL OUTER JOIN: MySQLでは未サポート(LEFT JOIN + UNION + RIGHT JOINで代替可能の旨を記載)
- LIMIT vs TOP: 本チートシートはLIMIT構文(MySQL/PostgreSQL共通)を使用
- INTERSECT / EXCEPT: MySQLは8.0.31以降で対応
- UPSERT: MySQL(ON DUPLICATE KEY UPDATE)とPostgreSQL(ON CONFLICT)で構文が異なる
コーディング規約
- CodeBlockコンポーネントは必ず
language="sql"を指定する - SQL文のキーワード(SELECT, FROM, WHEREなど)は大文字で統一する
- テーブル名・カラム名はスネークケース(小文字)で統一する
- 各セクションの説明文は1〜2文で簡潔に(Gitチートシートと同等の密度)
- コードブロック内では日本語コメント(
-- コメント)で文脈を補足する
既存コンテンツとの整合
- relatedCheatsheetSlugs で regex と http-status-codes を指定するが、それらのmeta.tsに逆方向のリンクを追加する必要はない(将来の改善として検討可能)
- relatedToolSlugs は空配列でよい(現時点でSQL関連ツールは存在しない)
完了条件
/mnt/data/yolo-web/src/cheatsheets/sql/meta.tsが作成され、全必須フィールドが設定されている/mnt/data/yolo-web/src/cheatsheets/sql/Component.tsxが作成され、8セクション全てが実装されている- SQLの記述順と実行順の違いがComponent冒頭に明示されている
- 全セクションでusers / orders / products の統一テーブル例を使用している
- registry.ts に新エントリが登録されている
- テストのカウントが更新されている
npm run lint && npm run format:check && npm run test && npm run buildが全てパスする- reviewerによるレビューで承認される
工数見積
builderエージェント1名で実装可能。meta.tsとComponent.tsxの2ファイル + registry.ts更新 + テスト更新の計4箇所の変更。Gitチートシートと同規模(約500行程度のComponent.tsx)を想定。