SQLによるテーブルデータの追加・更新・削除操作

関係データベースにおける基本的なデータ操作は、INSERTUPDATEDELETE の3つのDML文で実現されます。以下に、各操作の実践的な使い方と注意点を、実際の教育データモデル(学生・科目・履修)を基に解説します。

1. データの挿入(INSERT)

単一レコードの挿入

明示的に列名を指定し、対応する値を提供します。列順と値順が一致している必要があります。

-- 学生マスタに新規登録:ID「STU-2024-007」、氏名「山田太郎」、学年「2年」
INSERT INTO students(id, name, grade, major, enrollment_year)
VALUES ('STU-2024-007', '山田太郎', 2, '情報工学', 2024);

-- 履修テーブルに初期登録:科目ID「SUB-101」、成績未確定(NULL)
INSERT INTO enrollments(student_id, subject_id, final_score)
VALUES ('STU-2024-007', 'SUB-101', NULL);

複数レコードの一括挿入

VALUES句にカンマ区切りで複数のタプルを並べることで、効率的に大量データを登録できます。

-- 科目マスタに3科目を同時に追加
INSERT INTO subjects(subject_id, title, credits, category)
VALUES 
  ('SUB-101', '関係データベース論', 3, '専門'),
  ('SUB-102', 'アルゴリズム設計', 3, '専門'),
  ('SUB-103', 'ネットワーク基礎', 2, '基礎');

サブクエリを用いた挿入

既存テーブルから条件付きで抽出した結果を、別のテーブルへ転送します。列数・型の整合性が必須です。

-- 情報工学専攻の全学生に対し、「SUB-101」の履修レコードを未評価状態で生成
INSERT INTO enrollments(student_id, subject_id, final_score, status)
SELECT id, 'SUB-101', NULL, 'pending'
FROM students
WHERE major = '情報工学';

2. データの更新(UPDATE)

単一条件による更新

WHERE句で厳密に1件または少数件を特定し、該当フィールドを変更します。

-- 学籍番号「STU-2024-007」の学生の学年を「3年」に変更
UPDATE students
SET grade = 3
WHERE id = 'STU-2024-007';

範囲条件による一括更新

条件に合致するすべての行に対して、算術演算や文字列操作を適用できます。

-- 全科目の単位数を1増加(例:カリキュラム改訂対応)
UPDATE subjects
SET credits = credits + 1;

他テーブル連携による動的更新

サブクエリで参照先テーブルの情報を取得し、それを基に更新内容を決定します。

-- 「関係データベース論」を履修中の学生の成績を一律+3点補正
UPDATE enrollments
SET final_score = COALESCE(final_score, 0) + 3
WHERE subject_id = (
  SELECT subject_id FROM subjects WHERE title = '関係データベース論'
);

3. データの削除(DELETE)

主キーによる精密削除

意図しない全件削除を防ぐため、必ずWHERE節を含む必要があります。

-- 学籍番号「STU-2024-007」の学生情報を完全削除
DELETE FROM students
WHERE id = 'STU-2024-007';

属性条件による複数削除

日付、数値、文字列などの比較条件で、複数レコードをまとめて除去可能です。

-- 入学年度が2020年以前の学生レコードをアーカイブ目的で削除
DELETE FROM students
WHERE enrollment_year < 2021;

存在チェックを伴う関連削除

EXISTS/NOT EXISTSを活用して、他テーブルとの関係性に基づくロジックで削除対象を絞ります。

-- 履修記録が1件も存在しない学生(退学者など)を削除
DELETE FROM students
WHERE NOT EXISTS (
  SELECT 1 FROM enrollments e WHERE e.student_id = students.id
);

構文概要とベストプラクティス

操作 推奨構文形式 重要な制約
INSERT INSERT INTO table(col1,col2,...) VALUES (v1,v2,...)
または
INSERT INTO table SELECT ...
列数・データ型の一致、NOT NULL制約違反の回避
UPDATE UPDATE table SET col = expr WHERE condition WHERE句の省略禁止、トランザクションでの実行推奨
DELETE DELETE FROM table WHERE condition WHERE無しの実行は全件削除→絶対避ける

実運用では、事前にSELECTで対象レコードを確認し、必要に応じてBEGIN TRANSACTIONCOMMIT/ROLLBACKで変更を保護することを強く推奨します。

タグ: SQL DML INSERT UPDATE delete

6月21日 20:08 投稿