関係データベースにおける基本的なデータ操作は、INSERT、UPDATE、DELETE の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 TRANSACTION~COMMIT/ROLLBACKで変更を保護することを強く推奨します。