ふくふくHukuhuku LLC
EP.11CS Basics対象: 中2以上 10分公開: 更新:

データベースの基礎:SQL と関係モデルの考え方

Excel との違い、関係モデルの 3 大要素 (テーブル・主キー・外部キー)、SQL の基本 4 句 (SELECT/INSERT/UPDATE/DELETE)、トランザクションと ACID。Python と SQLite で実演。

#データベース#SQL#SQLite#関係モデル
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

データベース は、「複数のデータが関連し合い、複数人が同時に使い、整合性を保ち、長期間保存される」状況の標準解。Excel の限界を超える瞬間に必要になります。

1. 関係モデルの 3 大要素

  • テーブル (リレーション): 行と列の表
  • 主キー (Primary Key): 各行を一意に識別する列 (例: user_id)
  • 外部キー (Foreign Key): 別テーブルの主キーを参照する列

2. シンプルな例: ECサイト

users テーブル——
user_id (PK)nameemail
1佐藤sato@example.com
2田中tanaka@example.com
orders テーブル———
order_id (PK)user_id (FK)productamount
1011ノート PC120000
1021マウス3000
1032キーボード8000

3. SQL の基本 4 句

CRUD の基本
SQL
-- 取得 (SELECT)SELECT name, email FROM users WHERE user_id = 1;
-- 追加 (INSERT)INSERT INTO users (name, email) VALUES ('鈴木', 'suzuki@example.com');
-- 更新 (UPDATE)UPDATE users SET email = 'new@example.com' WHERE user_id = 1;
-- 削除 (DELETE)DELETE FROM users WHERE user_id = 1;
-- 結合 (JOIN) — テーブルをまたいで取得SELECT u.name, o.product, o.amountFROM users uJOIN orders o ON u.user_id = o.user_idWHERE u.user_id = 1;
-- 集計 (GROUP BY)SELECT user_id, COUNT(*) as order_count, SUM(amount) as totalFROM ordersGROUP BY user_id;

4. SQLite で実演 (Python)

Python 標準ライブラリで DB 操作
Python
import sqlite3
# DB 接続 (なければ新規作成)conn = sqlite3.connect('shop.db')cur = conn.cursor()
# テーブル作成cur.execute('''    CREATE TABLE IF NOT EXISTS users (        user_id INTEGER PRIMARY KEY,        name TEXT NOT NULL,        email TEXT UNIQUE    )''')
# データ追加cur.execute("INSERT INTO users (name, email) VALUES (?, ?)",            ('佐藤', 'sato@example.com'))conn.commit()
# 取得cur.execute("SELECT * FROM users")for row in cur.fetchall():    print(row)
conn.close()

5. インデックスの威力

インデックス = 検索高速化のための内部データ構造 (B ツリーが主流)。「100 万行から 1 件探す」が インデックスなしで 1 秒、インデックスありで 1ms のような桁違いの差が出ます。

インデックス作成
SQL
-- email 列で頻繁に検索するならインデックスをCREATE INDEX idx_users_email ON users(email);
-- WHERE で使うとインデックスが効くSELECT * FROM users WHERE email = 'sato@example.com';-- → インデックスを使った高速検索 O(log n)
-- インデックスは書込み時にコストがかかる-- 全列にインデックス張ると書込みが遅くなる ← 落とし穴

6. トランザクションと ACID

  • Atomicity (原子性): 「A から B への送金」のような複数操作を、全部成功 or 全部キャンセル
  • Consistency (一貫性): 制約 (主キー・外部キー) が常に守られる
  • Isolation (独立性): 同時実行時、互いに干渉しない (READ COMMITTED 等のレベル)
  • Durability (永続性): 一度 commit したらクラッシュしても残る

7. 次の話

EP.12 (最終回) では AI 時代の CS として、なぜ今もこれらの基礎が重要かをまとめます。

よくある質問

Excel とデータベースの違い
**Excel** は単一ファイル・1 シート単位、複数人同時編集に弱い、数万件超で重い。**データベース** は複数テーブルを関連付け、同時編集対応、数千万行も高速、トランザクション (途中失敗時の巻戻し) 対応。「シリアスなデータ管理は DB」。
SQL は難しい?
基本 (SELECT/WHERE/JOIN) は中学生でも 1 週間で書けるレベル。難しいのは「複雑な集計」「インデックス設計」「パフォーマンスチューニング」。基礎は誰でも、応用はプロが磨く、という性質。
RDB と NoSQL の違い
**RDB (関係データベース、SQL)**: テーブル + 関係性、整合性が強い (PostgreSQL / MySQL)。**NoSQL**: 柔軟なスキーマ、スケールしやすい (MongoDB, Redis, DynamoDB)。**「迷ったら RDB」が現代の標準アドバイス**。
ACID って何?
トランザクションが満たすべき 4 つの性質。**Atomicity** (全か無か)、**Consistency** (整合性維持)、**Isolation** (他との隔離)、**Durability** (永続性)。銀行送金等の金融処理では絶対必要。
SQLite ってどう使う?
Python 標準ライブラリに入っているので追加インストール不要。`import sqlite3; conn = sqlite3.connect('test.db')` でファイル DB を作って使える。学習・小規模アプリには最適。本格運用は PostgreSQL / MySQL に移行。
シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp