Step 3:データベースとテーブルの基本

🗂️ Step 3: データベースとテーブルの基本

データベースとテーブルを実際に作ってみよう!

📋 このステップで学ぶこと
  • データベースとテーブルの関係
  • テーブルの作成方法(CREATE TABLE)
  • データ型の種類と選び方
  • 主キー(PRIMARY KEY)の概念
  • 制約(NOT NULL、DEFAULT など)の使い方

🎯 1. データベースとは?

1-1. データベースの役割

Step 1で「データベースは図書館のようなもの」と学びました。ここでは、さらに詳しく見ていきましょう。

データベースは、複数のテーブルをまとめて管理する「入れ物」です。1つのデータベースの中に、関連する複数のテーブルを作ることができます。

🏢 会社の管理システムで例えると…

「会社管理システム」というデータベースの中には、こんなテーブルが入っています:

  • 社員テーブル – 社員の名前、部署、入社日など
  • 部署テーブル – 部署名、所在地など
  • 給与テーブル – 月給、ボーナスなど
  • 勤怠テーブル – 出勤日、退勤時間など

このように、関連するテーブルを1つのデータベースにまとめて管理します。

1-2. なぜテーブルを分けるのか?

「全部1つのテーブルにまとめればいいのでは?」と思うかもしれません。しかし、テーブルを分ける理由があります。

✅ テーブルを分ける3つのメリット
  • 重複を防げる – 同じ情報を何度も書かなくて済む
  • 修正が楽 – 1箇所を直せば全体に反映される
  • データが整理される – 種類ごとに分かれているので見やすい

1-3. SQLiteでのデータベース

SQLiteでは、1つのファイル = 1つのデータベースです。Step 2で作成した「practice.db」ファイルが、まさにデータベースです。

💡 覚えておこう

SQLiteでは、データベースを作成する特別なコマンドは不要です。「新しいデータベース」を作るときは、DB Browser for SQLiteで「ファイル」→「新しいデータベース」を選ぶだけでOKです。

📊 2. テーブルとは?

2-1. テーブルの基本構造を理解する

テーブルは、データを整理して保存するための「表」です。Excelのシートとよく似ています。

テーブルには、列(カラム)行(レコード)があります。

📋 生徒テーブルの例
生徒ID 名前 年齢 クラス
1 田中太郎 15 A組
2 鈴木花子 14 B組
3 佐藤次郎 15 A組
📌 用語の確認
用語 意味 上の例では
列(カラム) 縦方向の項目 生徒ID、名前、年齢、クラス(4列)
行(レコード) 横方向の1件分のデータ 3人分のデータ(3行)

2-2. テーブルを作成する命令:CREATE TABLE

テーブルを作成するには、CREATE TABLE(クリエイト テーブル)という命令を使います。「テーブルを作成しなさい」という意味です。

📝 CREATE TABLE の基本構文
CREATE TABLE テーブル名 (
    列名1 データ型,
    列名2 データ型,
    列名3 データ型
);

この構文を分解して、1つずつ理解していきましょう。

📌 構文の意味
部分 意味
CREATE TABLE 「テーブルを作成しなさい」という命令
テーブル名 作成するテーブルの名前(自分で決める)
( ) カッコの中に列の定義を書く
列名 データ型 列の名前と、その列に入れるデータの種類
,(カンマ) 列と列の区切り(最後の列には不要)
;(セミコロン) SQLの終わりを示す

2-3. 実際にテーブルを作ってみよう

先ほどの「生徒テーブル」を実際に作成してみましょう。以下のSQLを入力して実行してください。

※横にスクロールできます

CREATE TABLE 生徒 ( 生徒ID INTEGER, 名前 TEXT, 年齢 INTEGER, クラス TEXT );
📌 このSQLの意味を1行ずつ解説
コード 意味
1行目 CREATE TABLE 生徒 ( 「生徒」という名前のテーブルを作成開始
2行目 生徒ID INTEGER, 「生徒ID」列を作成、整数型
3行目 名前 TEXT, 「名前」列を作成、文字列型
4行目 年齢 INTEGER, 「年齢」列を作成、整数型
5行目 クラス TEXT 「クラス」列を作成、文字列型(最後なのでカンマなし)
6行目 ); テーブル定義の終了
✅ 成功の確認方法

DB Browser for SQLiteの場合、左側の「データベース構造」に「生徒」テーブルが表示されればOKです。

🔢 3. データ型の種類と選び方

3-1. データ型とは?

データ型とは、「この列にはどんな種類のデータを入れるか」を決めるものです。

例えば、「年齢」には数字を入れたいのでINTEGER(整数)、「名前」には文字を入れたいのでTEXT(文字列)を指定します。

🤔 なぜデータ型を指定するの?
  • 間違いを防ぐ – 「年齢」に「田中」と入れるミスを防げる
  • 計算ができる – 数字として指定すれば、合計や平均が計算できる
  • 効率が良い – 適切なデータ型を使うと、データベースが速く動く

3-2. SQLiteの主なデータ型

SQLiteには、主に5つのデータ型があります。最初は3つ(INTEGER、TEXT、REAL)だけ覚えれば十分です。

📋 SQLiteの主要データ型
データ型 意味 入れられるデータ 使用例
INTEGER 整数型 小数点のない数字 1, 100, -5, 0
REAL 実数型 小数点を含む数字 3.14, -2.5, 0.99
TEXT 文字列型 文字や文章 ‘田中太郎’, ‘A組’
BLOB バイナリ型 画像やファイル (初心者は使わなくてOK)
NULL ヌル 「値がない」を表す (特別な値)

3-3. データ型の選び方

どのデータ型を使えばいいか迷ったら、以下を参考にしてください。

🔢 INTEGER(整数型)を使う場面
  • 年齢:25
  • 個数:10
  • ID番号:1001
  • 年度:2025
  • 価格(円):1500

ポイント:計算に使う整数はINTEGER

📊 REAL(実数型)を使う場面
  • 身長:175.5
  • 体重:62.3
  • 気温:23.5
  • 評価点:4.8
  • 価格(ドル):19.99

ポイント:小数点が必要な数値はREAL

📝 TEXT(文字列型)を使う場面
  • 名前:’田中太郎’
  • 住所:’東京都渋谷区’
  • メールアドレス:’user@example.com’
  • 電話番号:’090-1234-5678′
  • 郵便番号:’150-0001′

ポイント:計算しない文字や数字はTEXT

⚠️ 注意:電話番号や郵便番号はTEXTを使う!

電話番号「090-1234-5678」や郵便番号「150-0001」は数字ですが、計算には使いません。また、先頭の「0」を残したい場合もあります。

INTEGERで保存すると「090」が「90」になってしまうので、TEXTを使いましょう

3-4. 様々なデータ型を使った実践例

商品テーブルを作って、様々なデータ型を使ってみましょう。

※横にスクロールできます

CREATE TABLE 商品 ( 商品ID INTEGER, 商品名 TEXT, 価格 INTEGER, 評価 REAL, 説明 TEXT, 在庫数 INTEGER );
📌 各列のデータ型を選んだ理由
列名 データ型 選んだ理由
商品ID INTEGER 商品を識別する番号(1, 2, 3…)
商品名 TEXT 文字で表す名前
価格 INTEGER 円単位の金額(小数点なし)
評価 REAL 4.5点のように小数点を使う
説明 TEXT 商品の説明文
在庫数 INTEGER 在庫の個数(整数)

🔑 4. 主キー(PRIMARY KEY)とは?

4-1. 主キーの役割

主キー(しゅキー)は、各行を一意に識別するための特別な列です。

「一意に識別する」とは、「その値を見れば、どの行か分かる」ということです。

🎒 身近な例で考えてみましょう
  • 学校の生徒番号 – 同じ番号の生徒は2人いない
  • 銀行の口座番号 – 同じ番号の口座は2つない
  • 運転免許証の番号 – 1人に1つの番号
  • マイナンバー – 1人に1つの番号

これらはすべて「主キー」の考え方と同じです。

4-2. なぜ主キーが必要なの?

主キーがないと、どの行を操作すればいいか分からなくなります。

❌ 主キーがない場合の問題
名前 年齢 クラス
田中太郎 15 A組
田中太郎 15 A組

「田中太郎さんの年齢を16に変更したい」とき、どちらの田中太郎さん?

✅ 主キーがある場合
生徒ID 名前 年齢 クラス
1 田中太郎 15 A組
2 田中太郎 15 A組

「生徒ID = 1 の年齢を16に変更」と指定できる!

4-3. 主キーの特徴

📌 主キーの4つのルール
ルール 意味
重複不可 同じ値が2つ以上あってはいけない
NULL不可 空欄は許されない(必ず値が必要)
変更しない 一度決めたら変更しないのが原則
1つだけ 1つのテーブルに主キーは1つ

4-4. 主キーを設定する方法

列名の後にPRIMARY KEYと書くだけで、その列が主キーになります。

※横にスクロールできます

CREATE TABLE 生徒 ( 生徒ID INTEGER PRIMARY KEY, 名前 TEXT, 年齢 INTEGER, クラス TEXT );
📌 このSQLの意味

生徒ID INTEGER PRIMARY KEY

  • 生徒ID – 列の名前
  • INTEGER – 整数型
  • PRIMARY KEY – この列を主キーにする

4-5. 主キーの動作を確認しよう

主キーを設定すると、重複したIDでデータを追加しようとするとエラーになります。実際に試してみましょう。

まず、生徒を2人追加します。

※横にスクロールできます

INSERT INTO 生徒 VALUES (1, ‘田中太郎’, 15, ‘A組’); INSERT INTO 生徒 VALUES (2, ‘鈴木花子’, 14, ‘B組’);

ここで、すでに使われている生徒ID「1」で追加しようとすると…

※横にスクロールできます

INSERT INTO 生徒 VALUES (1, ‘佐藤次郎’, 15, ‘A組’);
エラー: UNIQUE constraint failed: 生徒.生徒ID (意味:生徒IDが重複しているのでエラーです)
✅ これが主キーの効果!

主キーのおかげで、うっかり同じIDを使ってしまうミスを防げます。

4-6. 自動採番(AUTOINCREMENT)

主キーを毎回自分で考えるのは面倒ですよね。AUTOINCREMENT(オートインクリメント)を使えば、IDを自動で1, 2, 3…と連番にしてくれます。

※横にスクロールできます

CREATE TABLE 商品 ( 商品ID INTEGER PRIMARY KEY AUTOINCREMENT, 商品名 TEXT, 価格 INTEGER );
📌 AUTOINCREMENTの意味
  • AUTO = 自動
  • INCREMENT = 増加
  • 合わせて「自動で増加する」という意味

データを追加するとき、商品IDを指定しなくても自動で番号が付きます。

※横にスクロールできます

INSERT INTO 商品 (商品名, 価格) VALUES (‘ノートPC’, 80000); INSERT INTO 商品 (商品名, 価格) VALUES (‘マウス’, 1500); INSERT INTO 商品 (商品名, 価格) VALUES (‘キーボード’, 3000);

商品IDを指定していないのに、自動で1, 2, 3と番号が付きます。

※横にスクロールできます

SELECT * FROM 商品;
📋 実行結果
商品ID 商品名 価格
1 ノートPC 80000
2 マウス 1500
3 キーボード 3000
💡 AUTOINCREMENTのメリット
  • IDを自分で考えなくて良い
  • 重複の心配がない
  • データ追加が楽になる

⚙️ 5. 制約(Constraint)を理解しよう

5-1. 制約とは?

制約は、データに関するルールのことです。「この列は空欄を許さない」「この列は0以上でなければいけない」など、データの品質を保つために設定します。

🏫 学校のルールで例えると…
  • 「名前は必ず書くこと」→ NOT NULL
  • 「同じ生徒番号は使えません」→ UNIQUE
  • 「年齢は0歳以上」→ CHECK
  • 「クラスを書かなければ『未定』にする」→ DEFAULT

5-2. よく使う制約の種類

📋 主な制約一覧
制約名 意味 使用例
PRIMARY KEY 主キー(重複不可、NULL不可) 生徒ID INTEGER PRIMARY KEY
NOT NULL NULLを許さない(必須項目) 名前 TEXT NOT NULL
UNIQUE 重複を許さない メール TEXT UNIQUE
DEFAULT 値が指定されない時のデフォルト値 在庫数 INTEGER DEFAULT 0
CHECK 値の条件をチェック 年齢 INTEGER CHECK(年齢 >= 0)

5-3. NOT NULL:必須項目にする

NOT NULLは、「この列は必ず値を入れなければならない」という制約です。「NULL(空)を許さない」という意味です。

※横にスクロールできます

CREATE TABLE 会員 ( 会員ID INTEGER PRIMARY KEY, 名前 TEXT NOT NULL, メールアドレス TEXT );
📌 このテーブルの意味
  • 名前 – NOT NULLなので必須。空欄は許されない
  • メールアドレス – NOT NULLがないので任意。空欄でもOK

名前を入れずにデータを追加しようとするとエラーになります。

※横にスクロールできます

— これはエラーになる(名前がない) INSERT INTO 会員 (会員ID, メールアドレス) VALUES (1, ‘test@example.com’);
エラー: NOT NULL constraint failed: 会員.名前 (意味:名前は必須なのに値がありません)

5-4. UNIQUE:重複を禁止する

UNIQUEは、「同じ値が2つ以上あってはいけない」という制約です。メールアドレスなど、重複してはいけない項目に使います。

※横にスクロールできます

CREATE TABLE ユーザー ( ユーザーID INTEGER PRIMARY KEY, 名前 TEXT NOT NULL, メールアドレス TEXT UNIQUE );

同じメールアドレスを登録しようとするとエラーになります。

※横にスクロールできます

— 1人目:OK INSERT INTO ユーザー VALUES (1, ‘田中太郎’, ‘tanaka@example.com’); — 2人目:同じメールアドレス → エラー! INSERT INTO ユーザー VALUES (2, ‘鈴木花子’, ‘tanaka@example.com’);
エラー: UNIQUE constraint failed: ユーザー.メールアドレス (意味:このメールアドレスは既に使われています)
💡 PRIMARY KEY と UNIQUE の違い
項目 PRIMARY KEY UNIQUE
重複 禁止 禁止
NULL 禁止 許可
テーブル内の数 1つだけ 複数OK

5-5. DEFAULT:初期値を設定する

DEFAULTは、値が指定されなかったときに自動で入れる値を設定します。

※横にスクロールできます

CREATE TABLE 商品 ( 商品ID INTEGER PRIMARY KEY, 商品名 TEXT NOT NULL, 在庫数 INTEGER DEFAULT 0, 公開状態 TEXT DEFAULT ‘非公開’ );
📌 このテーブルの意味
  • 在庫数 – 指定しなければ自動で「0」が入る
  • 公開状態 – 指定しなければ自動で「非公開」が入る

在庫数と公開状態を指定せずにデータを追加してみます。

※横にスクロールできます

INSERT INTO 商品 (商品ID, 商品名) VALUES (1, ‘ノートPC’);

※横にスクロールできます

SELECT * FROM 商品;
📋 実行結果
商品ID 商品名 在庫数 公開状態
1 ノートPC 0 非公開

在庫数と公開状態はDEFAULT値が自動で入りました!

5-6. CHECK:値の条件をチェックする

CHECKは、値が条件を満たしているかチェックします。「年齢は0以上」「価格はマイナスにならない」などのルールを設定できます。

※横にスクロールできます

CREATE TABLE 社員 ( 社員ID INTEGER PRIMARY KEY, 名前 TEXT NOT NULL, 年齢 INTEGER CHECK(年齢 >= 18), 給与 INTEGER CHECK(給与 > 0) );
📌 このテーブルの意味
  • 年齢 CHECK(年齢 >= 18) – 年齢は18歳以上でなければいけない
  • 給与 CHECK(給与 > 0) – 給与は0より大きくなければいけない

条件を満たさないデータを追加しようとするとエラーになります。

※横にスクロールできます

— 年齢が17歳 → エラー! INSERT INTO 社員 VALUES (1, ‘田中太郎’, 17, 250000);
エラー: CHECK constraint failed: 社員 (意味:CHECKの条件を満たしていません)

5-7. 複数の制約を組み合わせる

1つの列に複数の制約を設定することができます。

※横にスクロールできます

CREATE TABLE 商品マスタ ( 商品ID INTEGER PRIMARY KEY AUTOINCREMENT, 商品名 TEXT NOT NULL, 価格 INTEGER NOT NULL CHECK(価格 >= 0), カテゴリ TEXT NOT NULL, 在庫数 INTEGER DEFAULT 0 CHECK(在庫数 >= 0), 商品コード TEXT UNIQUE );
📌 各列の制約を整理
列名 制約 意味
商品ID PRIMARY KEY AUTOINCREMENT 主キー、自動採番
商品名 NOT NULL 必須
価格 NOT NULL CHECK(価格 >= 0) 必須、0以上
カテゴリ NOT NULL 必須
在庫数 DEFAULT 0 CHECK(在庫数 >= 0) 初期値0、0以上
商品コード UNIQUE 重複禁止

🎯 6. 実践:完全なテーブルを作成しよう

6-1. ECサイトの商品テーブルを作る

これまで学んだことを全て活用して、実用的なテーブルを作成します。1行ずつ解説しながら作っていきましょう。

ステップ1:テーブルの作成開始

※横にスクロールできます

CREATE TABLE EC商品 (

意味:「EC商品」という名前のテーブルを作成開始します。

ステップ2:主キーを定義

※横にスクロールできます

商品ID INTEGER PRIMARY KEY AUTOINCREMENT,

意味:商品IDを主キーにし、自動で連番を振ります。
なぜ:商品を一意に識別するため。自動採番で重複を防ぎます。

ステップ3:必須項目を定義

※横にスクロールできます

商品名 TEXT NOT NULL, 価格 INTEGER NOT NULL CHECK(価格 >= 0), カテゴリ TEXT NOT NULL,

意味:

  • 商品名 – 必須項目(NOT NULL)
  • 価格 – 必須項目、かつ0以上(CHECK)
  • カテゴリ – 必須項目

なぜ:商品名・価格・カテゴリは商品に必ず必要な情報だからです。

ステップ4:初期値のある項目を定義

※横にスクロールできます

在庫数 INTEGER DEFAULT 0 CHECK(在庫数 >= 0),

意味:在庫数は初期値0、0以上でなければならない
なぜ:新商品登録時は在庫0の場合が多いため。マイナス在庫は不正なデータです。

ステップ5:任意項目を定義

※横にスクロールできます

説明 TEXT, 評価 REAL CHECK(評価 >= 0 AND 評価 <= 5),

意味:

  • 説明 – 任意項目(NOT NULLなし)
  • 評価 – 0〜5の範囲のみ許可

なぜ:説明は後から追加することもあるため任意。評価は5点満点を想定しています。

ステップ6:登録日を自動設定

※横にスクロールできます

登録日 TEXT DEFAULT (datetime(‘now’, ‘localtime’)) );

意味:登録日は自動で現在日時が入る
なぜ:いつ登録されたか自動で記録するためです。

完成コード

上記を全てまとめると、以下のようになります。

※横にスクロールできます

CREATE TABLE EC商品 ( 商品ID INTEGER PRIMARY KEY AUTOINCREMENT, 商品名 TEXT NOT NULL, 価格 INTEGER NOT NULL CHECK(価格 >= 0), カテゴリ TEXT NOT NULL, 在庫数 INTEGER DEFAULT 0 CHECK(在庫数 >= 0), 説明 TEXT, 評価 REAL CHECK(評価 >= 0 AND 評価 <= 5), 登録日 TEXT DEFAULT (datetime('now', 'localtime')) );

6-2. データを追加してみよう

作成したテーブルにデータを追加します。

※横にスクロールできます

INSERT INTO EC商品 (商品名, 価格, カテゴリ, 在庫数, 説明, 評価) VALUES (‘ノートPC’, 80000, ‘電化製品’, 5, ‘高性能なノートパソコン’, 4.5), (‘マウス’, 1500, ‘電化製品’, 20, ‘ワイヤレスマウス’, 4.2), (‘デスク’, 15000, ‘家具’, 3, ‘広々とした作業デスク’, 4.7), (‘チェア’, 12000, ‘家具’, 8, ‘エルゴノミクスチェア’, 4.6), (‘モニター’, 25000, ‘電化製品’, 10, ’27インチ4Kモニター’, 4.8);

6-3. データを確認しよう

※横にスクロールできます

SELECT * FROM EC商品;
📋 実行結果
商品ID 商品名 価格 カテゴリ 在庫数 説明 評価 登録日
1 ノートPC 80000 電化製品 5 高性能な… 4.5 2025-11-30 …
2 マウス 1500 電化製品 20 ワイヤレス… 4.2 2025-11-30 …
3 デスク 15000 家具 3 広々とした… 4.7 2025-11-30 …

商品IDが自動採番され、登録日も自動で入りました!

🗑️ 7. テーブルの削除と変更

7-1. テーブルを削除する:DROP TABLE

テーブルを削除するには、DROP TABLEを使います。

※横にスクロールできます

DROP TABLE テーブル名;
⚠️ 重要な注意

DROP TABLEを実行すると、テーブルとその中のデータが全て消えます。元に戻せません!

実行前に本当に削除していいか、よく確認しましょう。

例えば、先ほど作った「生徒」テーブルを削除するには:

※横にスクロールできます

DROP TABLE 生徒;

7-2. テーブルに列を追加する:ALTER TABLE

既存のテーブルに列を追加するには、ALTER TABLEを使います。

※横にスクロールできます

ALTER TABLE テーブル名 ADD COLUMN 列名 データ型;

例えば、商品テーブルに「製造元」列を追加するには:

※横にスクロールできます

ALTER TABLE EC商品 ADD COLUMN 製造元 TEXT;
⚠️ SQLiteの制限

SQLiteでは、列の追加はできますが、列の削除や列名の変更は難しいです。

そのため、テーブルは最初にしっかり設計することが大切です。

📝 Step 3 のまとめ

✅ このステップで学んだこと
学んだこと キーワード
テーブルの作成 CREATE TABLE
データ型 INTEGER, REAL, TEXT
主キー PRIMARY KEY
自動採番 AUTOINCREMENT
必須項目 NOT NULL
重複禁止 UNIQUE
初期値 DEFAULT
条件チェック CHECK
テーブル削除 DROP TABLE
列の追加 ALTER TABLE ADD COLUMN
🎯 次のステップへ

テーブルの作成ができるようになりました!

次のStep 4からは、いよいよSELECT文を使ってデータを取り出す方法を学びます。SQLの中で最もよく使う、とても重要な命令です!

❓ よくある質問

Q1: データ型を間違えて作ってしまいました…

残念ながら、SQLiteでは列のデータ型を後から変更できません。新しいテーブルを作り直す必要があります。

だからこそ、最初の設計が大切です!作成前にどんな列が必要か、よく考えましょう。

Q2: 主キーは必ず必要ですか?

必須ではありませんが、強く推奨します。

主キーがないと、特定の行を更新・削除するのが困難になります。ほとんどのテーブルには主キーを設定するのがベストプラクティスです。

Q3: 日本語のテーブル名や列名は使えますか?

使えますが、実務ではおすすめしません。

このコースでは分かりやすさのために日本語を使っていますが、実務では英語を使うのが一般的です。例:products、customer_name、created_at など。

Q4: NULLって何ですか?

NULLは「値がない」ことを表す特別な値です。

「0」や「空文字(”)」とは違います。「まだ決まっていない」「該当なし」といった状況で使われます。

NULLの例
  • まだ決まっていない納品日 → NULL
  • 登録されていないメールアドレス → NULL
  • 未入力の備考欄 → NULL

Q5: 制約を後から追加できますか?

SQLiteでは制約の後付けが難しいです。NOT NULLやCHECKなどは、テーブル作成時に設定する必要があります。

これも、最初の設計が重要な理由の1つです。

Q6: 1つのデータベースに何個までテーブルを作れますか?

実質的には制限なしです。必要な数だけテーブルを作成できます。

ただし、管理しやすいように、関連するテーブルは同じデータベースにまとめましょう。

📝

学習メモ

SQL基礎 - Step 3

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE