🗂️ Step 3: データベースとテーブルの基本
データベースとテーブルを実際に作ってみよう!
- データベースとテーブルの関係
- テーブルの作成方法(CREATE TABLE)
- データ型の種類と選び方
- 主キー(PRIMARY KEY)の概念
- 制約(NOT NULL、DEFAULT など)の使い方
🎯 1. データベースとは?
1-1. データベースの役割
Step 1で「データベースは図書館のようなもの」と学びました。ここでは、さらに詳しく見ていきましょう。
データベースは、複数のテーブルをまとめて管理する「入れ物」です。1つのデータベースの中に、関連する複数のテーブルを作ることができます。
「会社管理システム」というデータベースの中には、こんなテーブルが入っています:
- 社員テーブル – 社員の名前、部署、入社日など
- 部署テーブル – 部署名、所在地など
- 給与テーブル – 月給、ボーナスなど
- 勤怠テーブル – 出勤日、退勤時間など
このように、関連するテーブルを1つのデータベースにまとめて管理します。
1-2. なぜテーブルを分けるのか?
「全部1つのテーブルにまとめればいいのでは?」と思うかもしれません。しかし、テーブルを分ける理由があります。
- 重複を防げる – 同じ情報を何度も書かなくて済む
- 修正が楽 – 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 テーブル名 (
列名1 データ型,
列名2 データ型,
列名3 データ型
);
この構文を分解して、1つずつ理解していきましょう。
| 部分 | 意味 |
|---|---|
| CREATE TABLE | 「テーブルを作成しなさい」という命令 |
| テーブル名 | 作成するテーブルの名前(自分で決める) |
| ( ) | カッコの中に列の定義を書く |
| 列名 データ型 | 列の名前と、その列に入れるデータの種類 |
| ,(カンマ) | 列と列の区切り(最後の列には不要) |
| ;(セミコロン) | SQLの終わりを示す |
2-3. 実際にテーブルを作ってみよう
先ほどの「生徒テーブル」を実際に作成してみましょう。以下のSQLを入力して実行してください。
※横にスクロールできます
| 行 | コード | 意味 |
|---|---|---|
| 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)だけ覚えれば十分です。
| データ型 | 意味 | 入れられるデータ | 使用例 |
|---|---|---|---|
| INTEGER | 整数型 | 小数点のない数字 | 1, 100, -5, 0 |
| REAL | 実数型 | 小数点を含む数字 | 3.14, -2.5, 0.99 |
| TEXT | 文字列型 | 文字や文章 | ‘田中太郎’, ‘A組’ |
| BLOB | バイナリ型 | 画像やファイル | (初心者は使わなくてOK) |
| NULL | ヌル | 「値がない」を表す | (特別な値) |
3-3. データ型の選び方
どのデータ型を使えばいいか迷ったら、以下を参考にしてください。
- 年齢:25
- 個数:10
- ID番号:1001
- 年度:2025
- 価格(円):1500
ポイント:計算に使う整数はINTEGER
- 身長:175.5
- 体重:62.3
- 気温:23.5
- 評価点:4.8
- 価格(ドル):19.99
ポイント:小数点が必要な数値はREAL
- 名前:’田中太郎’
- 住所:’東京都渋谷区’
- メールアドレス:’user@example.com’
- 電話番号:’090-1234-5678′
- 郵便番号:’150-0001′
ポイント:計算しない文字や数字はTEXT
電話番号「090-1234-5678」や郵便番号「150-0001」は数字ですが、計算には使いません。また、先頭の「0」を残したい場合もあります。
INTEGERで保存すると「090」が「90」になってしまうので、TEXTを使いましょう。
3-4. 様々なデータ型を使った実践例
商品テーブルを作って、様々なデータ型を使ってみましょう。
※横にスクロールできます
| 列名 | データ型 | 選んだ理由 |
|---|---|---|
| 商品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. 主キーの特徴
| ルール | 意味 |
|---|---|
| 重複不可 | 同じ値が2つ以上あってはいけない |
| NULL不可 | 空欄は許されない(必ず値が必要) |
| 変更しない | 一度決めたら変更しないのが原則 |
| 1つだけ | 1つのテーブルに主キーは1つ |
4-4. 主キーを設定する方法
列名の後にPRIMARY KEYと書くだけで、その列が主キーになります。
※横にスクロールできます
生徒ID INTEGER PRIMARY KEY
- 生徒ID – 列の名前
- INTEGER – 整数型
- PRIMARY KEY – この列を主キーにする
4-5. 主キーの動作を確認しよう
主キーを設定すると、重複したIDでデータを追加しようとするとエラーになります。実際に試してみましょう。
まず、生徒を2人追加します。
※横にスクロールできます
ここで、すでに使われている生徒ID「1」で追加しようとすると…
※横にスクロールできます
主キーのおかげで、うっかり同じIDを使ってしまうミスを防げます。
4-6. 自動採番(AUTOINCREMENT)
主キーを毎回自分で考えるのは面倒ですよね。AUTOINCREMENT(オートインクリメント)を使えば、IDを自動で1, 2, 3…と連番にしてくれます。
※横にスクロールできます
- AUTO = 自動
- INCREMENT = 増加
- 合わせて「自動で増加する」という意味
データを追加するとき、商品IDを指定しなくても自動で番号が付きます。
※横にスクロールできます
商品IDを指定していないのに、自動で1, 2, 3と番号が付きます。
※横にスクロールできます
| 商品ID | 商品名 | 価格 |
|---|---|---|
| 1 | ノートPC | 80000 |
| 2 | マウス | 1500 |
| 3 | キーボード | 3000 |
- 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(空)を許さない」という意味です。
※横にスクロールできます
- 名前 – NOT NULLなので必須。空欄は許されない
- メールアドレス – NOT NULLがないので任意。空欄でもOK
名前を入れずにデータを追加しようとするとエラーになります。
※横にスクロールできます
5-4. UNIQUE:重複を禁止する
UNIQUEは、「同じ値が2つ以上あってはいけない」という制約です。メールアドレスなど、重複してはいけない項目に使います。
※横にスクロールできます
同じメールアドレスを登録しようとするとエラーになります。
※横にスクロールできます
| 項目 | PRIMARY KEY | UNIQUE |
|---|---|---|
| 重複 | 禁止 | 禁止 |
| NULL | 禁止 | 許可 |
| テーブル内の数 | 1つだけ | 複数OK |
5-5. DEFAULT:初期値を設定する
DEFAULTは、値が指定されなかったときに自動で入れる値を設定します。
※横にスクロールできます
- 在庫数 – 指定しなければ自動で「0」が入る
- 公開状態 – 指定しなければ自動で「非公開」が入る
在庫数と公開状態を指定せずにデータを追加してみます。
※横にスクロールできます
※横にスクロールできます
| 商品ID | 商品名 | 在庫数 | 公開状態 |
|---|---|---|---|
| 1 | ノートPC | 0 | 非公開 |
在庫数と公開状態はDEFAULT値が自動で入りました!
5-6. CHECK:値の条件をチェックする
CHECKは、値が条件を満たしているかチェックします。「年齢は0以上」「価格はマイナスにならない」などのルールを設定できます。
※横にスクロールできます
- 年齢 CHECK(年齢 >= 18) – 年齢は18歳以上でなければいけない
- 給与 CHECK(給与 > 0) – 給与は0より大きくなければいけない
条件を満たさないデータを追加しようとするとエラーになります。
※横にスクロールできます
5-7. 複数の制約を組み合わせる
1つの列に複数の制約を設定することができます。
※横にスクロールできます
| 列名 | 制約 | 意味 |
|---|---|---|
| 商品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:テーブルの作成開始
※横にスクロールできます
意味:「EC商品」という名前のテーブルを作成開始します。
ステップ2:主キーを定義
※横にスクロールできます
意味:商品IDを主キーにし、自動で連番を振ります。
なぜ:商品を一意に識別するため。自動採番で重複を防ぎます。
ステップ3:必須項目を定義
※横にスクロールできます
意味:
- 商品名 – 必須項目(NOT NULL)
- 価格 – 必須項目、かつ0以上(CHECK)
- カテゴリ – 必須項目
なぜ:商品名・価格・カテゴリは商品に必ず必要な情報だからです。
ステップ4:初期値のある項目を定義
※横にスクロールできます
意味:在庫数は初期値0、0以上でなければならない
なぜ:新商品登録時は在庫0の場合が多いため。マイナス在庫は不正なデータです。
ステップ5:任意項目を定義
※横にスクロールできます
意味:
- 説明 – 任意項目(NOT NULLなし)
- 評価 – 0〜5の範囲のみ許可
なぜ:説明は後から追加することもあるため任意。評価は5点満点を想定しています。
ステップ6:登録日を自動設定
※横にスクロールできます
意味:登録日は自動で現在日時が入る
なぜ:いつ登録されたか自動で記録するためです。
完成コード
上記を全てまとめると、以下のようになります。
※横にスクロールできます
6-2. データを追加してみよう
作成したテーブルにデータを追加します。
※横にスクロールできます
6-3. データを確認しよう
※横にスクロールできます
| 商品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を実行すると、テーブルとその中のデータが全て消えます。元に戻せません!
実行前に本当に削除していいか、よく確認しましょう。
例えば、先ほど作った「生徒」テーブルを削除するには:
※横にスクロールできます
7-2. テーブルに列を追加する:ALTER TABLE
既存のテーブルに列を追加するには、ALTER TABLEを使います。
※横にスクロールできます
例えば、商品テーブルに「製造元」列を追加するには:
※横にスクロールできます
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
Q5: 制約を後から追加できますか?
SQLiteでは制約の後付けが難しいです。NOT NULLやCHECKなどは、テーブル作成時に設定する必要があります。
これも、最初の設計が重要な理由の1つです。
Q6: 1つのデータベースに何個までテーブルを作れますか?
実質的には制限なしです。必要な数だけテーブルを作成できます。
ただし、管理しやすいように、関連するテーブルは同じデータベースにまとめましょう。
学習メモ
SQL基礎 - Step 3