本文へスキップ
BecomeCoder

SQL テーブル設計 (DDL)コース · 第7章 実務へ · レッスン24

設計から実装まで ― 総合演習

ブラウザで完結

導入

最後に、この講座で学んだことを通しで使ってみましょう。要件を読み、ER 図を思い描き、テーブルを設計し、データを入れ、JOIN で取り出す。ここまで来たあなたなら、もう「0から」ではなく「設計から」DB を組み立てられます。

説明

要件はこうです。「ブログの記事(posts)に、複数のコメント(comments)が付く」。1つの記事に多くのコメント――典型的な 1対多 です。ER 図はこうなります。

flowchart LR
  P["posts(記事)<br/>id, title"] -->|"1つの記事に<br/>多くのコメント 1:N"| C["comments(コメント)<br/>id, post_id, body"]

これを実装に落とします。学んだことを全部使います――親→子の順で CREATE外部キーで関係を表現、INSERT でシード、JOIN で組み立て。

-- スキーマ(親 posts → 子 comments)
DROP TABLE IF EXISTS comments;
DROP TABLE IF EXISTS posts;

CREATE TABLE posts (
  id    INTEGER PRIMARY KEY,
  title TEXT NOT NULL
);

CREATE TABLE comments (
  id      INTEGER PRIMARY KEY,
  post_id INTEGER NOT NULL,
  body    TEXT,
  FOREIGN KEY (post_id) REFERENCES posts(id)
);

-- シード
INSERT INTO posts (id, title) VALUES
  (1, 'SQL入門'), (2, 'DB設計のコツ');
INSERT INTO comments (id, post_id, body) VALUES
  (1, 1, 'わかりやすい!'),
  (2, 1, '続きが読みたい'),
  (3, 2, '正規化の話が刺さった');

-- 記事ごとのコメント数(JOIN + 集計。注意: コメント0件も出すなら LEFT JOIN)
SELECT p.title, COUNT(c.id) AS コメント数
FROM posts p
LEFT JOIN comments c ON c.post_id = p.id
GROUP BY p.title
ORDER BY コメント数 DESC;

要件(1対多)→ ER 図 → CREATE TABLEFOREIGN KEYINSERTJOIN+集計。第0章から第7章までの流れが、この1画面にすべて詰まっています。

やってみよう

初期表示のクエリpostscomments の作成)を実行してから、上の「シード」と「集計」の SQL を貼り付けて実行してください。記事ごとのコメント数が出れば、設計から実装・集計までを自力で回せたことになります。ここまで来たら、あとは自分の作りたいものの ER 図を描いて、同じ手順を繰り返すだけです。

演習

上で作った comments に、post_id = 2 の記事へのコメントを1件追加してください(id=4、body は自由)。そのあと SELECT * FROM comments WHERE post_id = 2; で増えたことを確認しましょう。

ヒント1を見る

INSERT INTO comments (id, post_id, body) VALUES (4, 2, '...');

ヒント2を見る

INSERT INTO comments (id, post_id, body) VALUES (4, 2, '参考になりました');


おつかれさまでした。 ここまでで、あなたは「データベースとは何か」という概念から、SELECT の基礎、集計、JOIN、データ操作、テーブル設計、正規化インデックストランザクションと ACID、ビュー・トリガー、そして設計プロセスまでを、手を動かして一通り身につけました。次の一歩は、実際の DBMS(MySQL や PostgreSQL)を1つ選んでインストールし、自分のアプリの ER 図を描いてみることです。この講座で作った“地図の読み方・描き方”は、そのまま実務で通用します。

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。