Step 12:データの挿入(INSERT)

➕ Step 12: データの挿入(INSERT)

新しいデータを追加してみよう!

📋 このステップで学ぶこと
  • INSERT文でデータを追加する基本
  • データ型に応じた値の書き方
  • 一部の列だけに値を入れる方法
  • 複数行の一括挿入
  • デフォルト値とNULLの違い
  • 自動採番(AUTOINCREMENT)の仕組み
  • INSERT時の注意点とエラー対策

🎯 1. INSERT文とは?

1-1. データベースに新しいデータを追加する

今までは、すでに存在するデータを見る(SELECT)ことだけをやってきました。

でも、データベースを使う上で、新しいデータを追加することも重要です。

💡 INSERT文が必要な場面
  • 新しい顧客を登録する
  • 新しい商品を追加する
  • 新しい注文を記録する
  • 新しいユーザーを登録する

そんなときに使うのがINSERT文です!

1-2. INSERT文の基本構文

📝 INSERT文の基本構文
INSERT INTO テーブル名 (列1, 列2, 列3)
VALUES (値1, 値2, 値3);
📌 構文の各部分の意味
部分 意味 なぜ必要?
INSERT INTO テーブル名 どのテーブルに追加するか 追加先を指定するため
(列1, 列2, 列3) どの列にデータを入れるか 値を入れる場所を明示するため
VALUES 値を指定するためのキーワード これから値を書くことを示す
(値1, 値2, 値3) 実際に入れるデータ 追加するデータの内容

1-3. 練習用テーブルの準備

今回は新しいテーブルを作成して練習しましょう。

ステップ1:顧客テーブルを作成

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

CREATE TABLE 顧客 ( 顧客ID INTEGER PRIMARY KEY, 顧客名 TEXT NOT NULL, メール TEXT, 都道府県 TEXT );
📌 このSQLの意味
部分 意味
顧客ID INTEGER PRIMARY KEY 整数型の主キー(重複不可)
顧客名 TEXT NOT NULL 文字列型、NULLは許可しない(必須)
メール TEXT 文字列型、NULLも許可(任意)
都道府県 TEXT 文字列型、NULLも許可(任意)

ステップ2:商品テーブルを作成

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

CREATE TABLE 商品 ( 商品ID INTEGER PRIMARY KEY, 商品名 TEXT NOT NULL, 価格 INTEGER NOT NULL, カテゴリ TEXT, 在庫数 INTEGER DEFAULT 0 );
📌 このSQLの意味
部分 意味
価格 INTEGER NOT NULL 整数型、NULLは許可しない(必須)
在庫数 INTEGER DEFAULT 0 整数型、デフォルト値は0

➕ 2. 基本的なINSERT

2-1. 1行のデータを追加する

まずは、1行だけデータを追加してみましょう。

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

INSERT INTO 顧客 (顧客ID, 顧客名, メール, 都道府県) VALUES (1, ‘田中太郎’, ‘tanaka@example.com’, ‘東京都’);
📌 このSQLの意味
部分 意味
INSERT INTO 顧客 顧客テーブルにデータを追加
(顧客ID, 顧客名, メール, 都道府県) 値を入れる4つの列を指定
VALUES (1, '田中太郎', ...) 列の順番どおりに値を指定

追加できたか確認してみましょう。

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

SELECT * FROM 顧客;
📋 実行結果
顧客ID 顧客名 メール 都道府県
1 田中太郎 tanaka@example.com 東京都

新しい顧客が追加されました!

2-2. データ型に応じた値の書き方

⚠️ データ型に注意!
データ型 書き方
文字列(TEXT) シングルクォート’で囲む '田中太郎'
数値(INTEGER, REAL) そのまま書く 150
日付(DATE) シングルクォート’で囲む '2024-11-09'
NULL クォートなしでNULL NULL

2-3. 商品を追加してみよう

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

INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ, 在庫数) VALUES (101, ‘りんご’, 150, ‘果物’, 50);

確認してみましょう。

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

SELECT * FROM 商品;
📋 実行結果
商品ID 商品名 価格 カテゴリ 在庫数
101 りんご 150 果物 50

📝 3. 一部の列だけに値を入れる

3-1. 必要な列だけを指定する

全ての列に値を入れる必要はありません。必要な列だけを指定できます。

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

INSERT INTO 顧客 (顧客ID, 顧客名) VALUES (2, ‘佐藤花子’);

この場合、指定しなかった列(メールと都道府県)はNULLになります。

確認してみましょう。

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

SELECT * FROM 顧客 WHERE 顧客ID = 2;
📋 実行結果
顧客ID 顧客名 メール 都道府県
2 佐藤花子 NULL NULL

指定しなかった列はNULLになりました。

3-2. NULLを明示的に入れる

NULLを明示的に入れることもできます。

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

INSERT INTO 顧客 (顧客ID, 顧客名, メール, 都道府県) VALUES (3, ‘鈴木次郎’, NULL, ‘大阪府’);
📋 実行結果
顧客ID 顧客名 メール 都道府県
3 鈴木次郎 NULL 大阪府

メールだけがNULLで、都道府県には値が入りました。

3-3. 列名を省略する方法(非推奨)

テーブルの全ての列に値を入れる場合、列名を省略することもできます。

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

INSERT INTO 顧客 VALUES (4, ‘高橋美咲’, ‘takahashi@example.com’, ‘神奈川県’);
⚠️ 列名省略の注意点(非推奨)
  • 全ての列の値を指定する必要がある
  • 値の順番はテーブル定義の順番と完全に一致させる
  • 列の順番や数が変わるとエラーになる
  • コードが読みにくい(どの値がどの列か分かりにくい)

推奨:列名は省略せず、明示的に書きましょう!

📦 4. 複数行の一括挿入

4-1. VALUESの後にカンマで区切って複数行を指定

1行ずつ追加する代わりに、複数の行をまとめて追加できます。

📝 複数行挿入の構文
INSERT INTO テーブル名 (列1, 列2, 列3)
VALUES 
    (値1, 値2, 値3),
    (値4, 値5, 値6),
    (値7, 値8, 値9);

4-2. 複数の顧客を一度に追加

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

INSERT INTO 顧客 (顧客ID, 顧客名, メール, 都道府県) VALUES (5, ‘山田三郎’, ‘yamada@example.com’, ‘福岡県’), (6, ‘伊藤花子’, ‘ito@example.com’, ‘千葉県’), (7, ‘渡辺太郎’, ‘watanabe@example.com’, ‘埼玉県’);

確認してみましょう。

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

SELECT * FROM 顧客;
📋 実行結果(7人)
顧客ID 顧客名 メール 都道府県
1 田中太郎 tanaka@example.com 東京都
2 佐藤花子 NULL NULL
3 鈴木次郎 NULL 大阪府
4 高橋美咲 takahashi@example.com 神奈川県
5 山田三郎 yamada@example.com 福岡県
6 伊藤花子 ito@example.com 千葉県
7 渡辺太郎 watanabe@example.com 埼玉県

3人の顧客が一度に追加されました(緑色の行)!

4-3. 複数の商品を一度に追加

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

INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ, 在庫数) VALUES (102, ‘みかん’, 100, ‘果物’, 30), (103, ‘バナナ’, 120, ‘果物’, 40), (104, ‘オレンジジュース’, 160, ‘飲料’, 25), (105, ‘お茶’, 120, ‘飲料’, 50);
💡 一括挿入のメリット
  • 効率的:1回のSQL文で複数行を追加
  • 速い:1行ずつより処理が高速
  • 読みやすい:関連するデータをまとめて記述

⚙️ 5. デフォルト値とNULL

5-1. デフォルト値とは?

テーブルを作るとき、列にデフォルト値を設定できます。値を指定しなかった場合、自動的にデフォルト値が入ります。

先ほど作った商品テーブルでは、在庫数 INTEGER DEFAULT 0と設定しました。

5-2. デフォルト値を使った挿入

在庫数を指定せずに商品を追加してみましょう。

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

INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ) VALUES (106, ‘コーヒー’, 180, ‘飲料’);

確認してみましょう。

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

SELECT * FROM 商品 WHERE 商品ID = 106;
📋 実行結果
商品ID 商品名 価格 カテゴリ 在庫数
106 コーヒー 180 飲料 0

在庫数を指定しなかったので、デフォルト値の0が自動的に入りました!

5-3. デフォルト値とNULLの違い

📌 デフォルト値とNULLの違い
項目 デフォルト値 NULL
意味 あらかじめ決められた値 「値がない」という状態
設定場所 テーブル作成時に設定 挿入時に指定(または省略)
在庫数が0 メールアドレスが未登録
計算での扱い 通常の値として計算される 計算結果がNULLになる

5-4. 明示的にDEFAULTを指定する

値の代わりにDEFAULTキーワードを使うこともできます。

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

INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ, 在庫数) VALUES (107, ‘ミルクティー’, 190, ‘飲料’, DEFAULT);

この場合も、在庫数にはデフォルト値の0が入ります。

🔑 6. 自動採番(AUTOINCREMENT)

6-1. IDを自動で割り振る仕組み

主キー(ID)は、通常自動で番号を割り振るように設定します。これを自動採番(AUTOINCREMENT)と呼びます。

自動採番を使うと、IDを考える必要がなく、重複も防げます。

6-2. 自動採番テーブルの作成

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

CREATE TABLE 注文 ( 注文ID INTEGER PRIMARY KEY AUTOINCREMENT, 顧客ID INTEGER NOT NULL, 商品ID INTEGER NOT NULL, 数量 INTEGER NOT NULL, 注文日 TEXT );
📌 このSQLの意味
部分 意味
PRIMARY KEY 主キー(一意で必須)
AUTOINCREMENT 自動的に連番を割り振る

6-3. IDを指定せずに挿入

自動採番を使う場合、IDを指定せずに挿入できます。

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

INSERT INTO 注文 (顧客ID, 商品ID, 数量, 注文日) VALUES (1, 101, 3, ‘2024-11-01’);

注文IDを指定していませんが、自動的に1が割り振られます。

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

SELECT * FROM 注文;
📋 実行結果
注文ID 顧客ID 商品ID 数量 注文日
1 1 101 3 2024-11-01

注文IDが自動的に1になりました!

6-4. 複数行を自動採番で追加

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

INSERT INTO 注文 (顧客ID, 商品ID, 数量, 注文日) VALUES (1, 102, 5, ‘2024-11-03’), (2, 101, 2, ‘2024-11-05’), (3, 104, 4, ‘2024-11-08’);

確認してみましょう。

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

SELECT * FROM 注文;
📋 実行結果
注文ID 顧客ID 商品ID 数量 注文日
1 1 101 3 2024-11-01
2 1 102 5 2024-11-03
3 2 101 2 2024-11-05
4 3 104 4 2024-11-08

注文IDが2, 3, 4と自動的に連番になりました!

💡 自動採番のメリット
  • IDの重複を防げる
  • IDを考える必要がない
  • データベースが自動管理してくれる
  • 実務ではほぼ必須の機能

⚠️ 7. INSERTの注意点とエラー

7-1. 主キーの重複エラー

同じIDで2回挿入しようとすると、エラーになります。

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

— 1回目:OK INSERT INTO 顧客 (顧客ID, 顧客名) VALUES (999, ‘テスト太郎’); — 2回目:エラー! INSERT INTO 顧客 (顧客ID, 顧客名) VALUES (999, ‘テスト花子’); — Error: UNIQUE constraint failed: 顧客.顧客ID
⚠️ 主キーは一意(ユニーク)!

主キーは重複できません。同じIDのデータは1つだけです。

対策:自動採番(AUTOINCREMENT)を使えば、重複を防げます。

7-2. NOT NULL制約違反

NOT NULL制約がついた列に値を入れないと、エラーになります。

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

— エラー:顧客名はNOT NULLなのに値がない INSERT INTO 顧客 (顧客ID, メール) VALUES (998, ‘test@example.com’); — Error: NOT NULL constraint failed: 顧客.顧客名
⚠️ NOT NULL制約

NOT NULLが設定された列には、必ず値を指定する必要があります。

例:顧客名、商品名、価格など、必須項目に使います。

7-3. データ型の不一致

列のデータ型と異なる値を入れると、エラーになることがあります。

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

— エラーの可能性:価格は数値なのに文字列を入れている INSERT INTO 商品 (商品ID, 商品名, 価格) VALUES (997, ‘テスト’, ‘あいうえお’); — Error: datatype mismatch
📌 エラーを防ぐためのポイント
  • 主キーは自動採番を使う
  • NOT NULL列には必ず値を入れる
  • 数値列には数値、文字列列には文字列を入れる
  • 日付は‘YYYY-MM-DD’形式で入れる

🔄 8. SELECTの結果をINSERT

8-1. 他のテーブルからデータをコピー

SELECT文の結果を、そのまま別のテーブルに挿入できます。これはデータのコピーバックアップに便利です。

📝 SELECT + INSERTの構文
INSERT INTO 新テーブル (列1, 列2, ...)
SELECT 列1, 列2, ...
FROM 元のテーブル
WHERE 条件;

8-2. バックアップテーブルの作成

まず、バックアップ用のテーブルを作成します。

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

CREATE TABLE 顧客バックアップ ( 顧客ID INTEGER, 顧客名 TEXT, メール TEXT, 都道府県 TEXT );

次に、顧客テーブルのデータをコピーします。

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

INSERT INTO 顧客バックアップ (顧客ID, 顧客名, メール, 都道府県) SELECT 顧客ID, 顧客名, メール, 都道府県 FROM 顧客;

確認してみましょう。

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

SELECT * FROM 顧客バックアップ;
📋 実行結果

顧客テーブルの全データがコピーされました!

8-3. 条件付きでコピー

WHERE句を使って、条件に合うデータだけをコピーすることもできます。

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

— 東京都の顧客だけをコピー INSERT INTO 顧客バックアップ (顧客ID, 顧客名, メール, 都道府県) SELECT 顧客ID, 顧客名, メール, 都道府県 FROM 顧客 WHERE 都道府県 = ‘東京都’;
💡 SELECT + INSERTの活用シーン
  • バックアップ:データの安全なコピー
  • データ移行:テーブル間でデータを移動
  • 集計結果の保存:計算結果を別テーブルに保存
  • 履歴テーブル:変更前のデータを保存

📝 Step 12 のまとめ

✅ このステップで学んだこと
学んだこと 内容
INSERT INTO テーブルに新しいデータを追加する
データ型 文字列は”で囲む、数値はそのまま
一部の列だけ 必要な列だけを指定して挿入できる
複数行の一括挿入 VALUESの後にカンマで区切って複数行
デフォルト値 値を省略すると自動的に設定される値
自動採番 AUTOINCREMENTでIDを自動割り振り
注意点 主キー重複、NOT NULL制約、データ型
SELECT + INSERT SELECTの結果を別テーブルにコピー
📝 INSERT文の基本形
-- 1行挿入
INSERT INTO テーブル名 (列1, 列2, 列3)
VALUES (値1, 値2, 値3);

-- 複数行挿入
INSERT INTO テーブル名 (列1, 列2, 列3)
VALUES 
    (値1, 値2, 値3),
    (値4, 値5, 値6),
    (値7, 値8, 値9);
🎯 次のステップへ

INSERT文でデータを追加できるようになりました!

次のStep 13では、データの更新(UPDATE)を学びます。既存のデータを変更する方法を学びます。

📝 練習問題

INSERT文を使いこなせるように練習しましょう!

問題 1 基本

顧客の追加

顧客テーブルに、以下の顧客を追加してください。

  • 顧客ID: 10
  • 顧客名: 加藤太郎
  • メール: kato@example.com
  • 都道府県: 愛知県

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

INSERT INTO 顧客 (顧客ID, 顧客名, メール, 都道府県) VALUES (10, ‘加藤太郎’, ‘kato@example.com’, ‘愛知県’);

解説:列名を指定して、対応する値を順番に入れます。文字列はシングルクォートで囲みます。

問題 2 基本

商品の追加

商品テーブルに、以下の商品を追加してください。

  • 商品ID: 110
  • 商品名: ぶどう
  • 価格: 300
  • カテゴリ: 果物
  • 在庫数: 20

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

INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ, 在庫数) VALUES (110, ‘ぶどう’, 300, ‘果物’, 20);

解説:数値(価格、在庫数)はクォートなしで書きます。

問題 3 基本

NULLを含むデータ

顧客テーブルに、メールアドレスが未登録の顧客を追加してください。

  • 顧客ID: 11
  • 顧客名: 中村花子
  • メール: NULL
  • 都道府県: 北海道

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

INSERT INTO 顧客 (顧客ID, 顧客名, メール, 都道府県) VALUES (11, ‘中村花子’, NULL, ‘北海道’);

解説:NULLはクォートなしで書きます。’NULL’と書くと文字列になってしまいます。

問題 4 基本

一部の列だけ指定

顧客テーブルに、顧客IDと顧客名だけを指定して、顧客を追加してください。

  • 顧客ID: 12
  • 顧客名: 小林次郎

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

INSERT INTO 顧客 (顧客ID, 顧客名) VALUES (12, ‘小林次郎’);

解説:指定しなかった列(メール、都道府県)はNULLになります。

問題 5 応用

複数行の一括挿入(顧客)

顧客テーブルに、以下の3人の顧客を一度に追加してください。

  • (13, ‘斎藤太郎’, ‘saito@example.com’, ‘京都府’)
  • (14, ‘松本花子’, ‘matsumoto@example.com’, ‘兵庫県’)
  • (15, ‘井上次郎’, ‘inoue@example.com’, ‘奈良県’)

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

INSERT INTO 顧客 (顧客ID, 顧客名, メール, 都道府県) VALUES (13, ‘斎藤太郎’, ‘saito@example.com’, ‘京都府’), (14, ‘松本花子’, ‘matsumoto@example.com’, ‘兵庫県’), (15, ‘井上次郎’, ‘inoue@example.com’, ‘奈良県’);

解説:VALUESの後に、カンマで区切って複数の行を指定します。

問題 6 応用

複数行の一括挿入(商品)

商品テーブルに、以下の3つの商品を一度に追加してください。

  • (111, ‘いちご’, 400, ‘果物’, 15)
  • (112, ‘メロン’, 800, ‘果物’, 10)
  • (113, ‘トマト’, 200, ‘野菜’, 30)

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

INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ, 在庫数) VALUES (111, ‘いちご’, 400, ‘果物’, 15), (112, ‘メロン’, 800, ‘果物’, 10), (113, ‘トマト’, 200, ‘野菜’, 30);

解説:複数の商品を一度に追加できます。

問題 7 応用

デフォルト値を使った挿入

商品テーブルに、在庫数を指定せずに商品を追加してください(デフォルト値の0が入ります)。

  • 商品ID: 114
  • 商品名: 新商品テスト
  • 価格: 250
  • カテゴリ: テスト

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

INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ) VALUES (114, ‘新商品テスト’, 250, ‘テスト’);

解説:在庫数を省略すると、デフォルト値の0が自動的に入ります。

問題 8 チャレンジ

自動採番で注文を追加

注文テーブルに、注文IDを指定せずに(自動採番で)注文を追加してください。

  • 顧客ID: 1
  • 商品ID: 103
  • 数量: 10
  • 注文日: 2024-11-15

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

INSERT INTO 注文 (顧客ID, 商品ID, 数量, 注文日) VALUES (1, 103, 10, ‘2024-11-15’);

解説:注文IDを指定しなければ、自動で番号が割り振られます(AUTOINCREMENTの場合)。

問題 9 チャレンジ

複数の注文を自動採番で追加

注文テーブルに、以下の3つの注文を注文IDを指定せずに一度に追加してください。

  • (顧客ID: 2, 商品ID: 102, 数量: 3, 注文日: ‘2024-11-16’)
  • (顧客ID: 3, 商品ID: 105, 数量: 2, 注文日: ‘2024-11-17’)
  • (顧客ID: 1, 商品ID: 101, 数量: 5, 注文日: ‘2024-11-18’)

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

INSERT INTO 注文 (顧客ID, 商品ID, 数量, 注文日) VALUES (2, 102, 3, ‘2024-11-16’), (3, 105, 2, ‘2024-11-17’), (1, 101, 5, ‘2024-11-18’);

解説:自動採番でも複数行を一度に挿入できます。

問題 10 チャレンジ

SELECTの結果をINSERT

「東京都」の顧客だけを「顧客バックアップ」テーブルにコピーしてください。

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

INSERT INTO 顧客バックアップ (顧客ID, 顧客名, メール, 都道府県) SELECT 顧客ID, 顧客名, メール, 都道府県 FROM 顧客 WHERE 都道府県 = ‘東京都’;

解説:WHERE句を使って、条件に合うデータだけをコピーします。

❓ よくある質問

Q1: 列名を省略してもいいですか?

全ての列に値を入れる場合は省略できますが、推奨しません。列名を明示した方が、コードが読みやすく、エラーも防げます。

Q2: 主キー(ID)は必ず指定しないといけませんか?

AUTOINCREMENTが設定されていれば、省略できます。自動で番号が割り振られます。実務では、IDは自動採番にするのが一般的です。

Q3: 文字列に’(シングルクォート)を含めたい場合は?

2つ重ねます。例:'It''s a pen' → It’s a pen

Q4: 日付の形式は?

SQLiteでは‘YYYY-MM-DD’形式が標準です。例:’2024-11-09’。時刻を含める場合は’YYYY-MM-DD HH:MM:SS’とします。

Q5: 挿入したデータのIDを確認するには?

SQLiteではSELECT last_insert_rowid();で、最後に挿入された行のIDを取得できます。

Q6: 間違えて挿入したデータを削除するには?

DELETE文を使います(Step 14で学習します)。例:DELETE FROM 顧客 WHERE 顧客ID = 999;

📝

学習メモ

SQL基礎 - Step 12

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