頻出高 ⏱ 6分★★★★☆

DML(挿入・更新・削除)

INSERT/UPDATE/DELETE/MERGE の完全ガイドと落とし穴

Data Manipulation Language — テーブルのデータを操作する SQL 命令の総称。INSERT・UPDATE・DELETE・MERGE が含まれる。

SQL 4 分類
分類命令役割
DDLCREATE/ALTER/DROPテーブル構造の定義・変更
DMLINSERT/UPDATE/DELETE/MERGEデータの操作
DCLGRANT/REVOKEアクセス権の制御
TCLCOMMIT/ROLLBACKトランザクション制御
-- 列指定あり(推奨:列順変更に強い)
INSERT INTO 顧客 (顧客ID, 顧客名, 都道府県)
VALUES ('C10', '田中', '東京');

-- 複数行を一括挿入
INSERT INTO 顧客 (顧客ID, 顧客名, 都道府県)
VALUES
  ('C11', '鈴木', '大阪'),
  ('C12', '佐藤', '福岡');

-- SELECT 結果を挿入(INSERT ... SELECT)
INSERT INTO 顧客バックアップ
SELECT * FROM 顧客 WHERE 区分 = '重要';
-- 単一行の更新
UPDATE 顧客
SET    都道府県 = '神奈川',
       更新日   = CURRENT_DATE
WHERE  顧客ID = 'C10';

-- サブクエリを使った UPDATE(他テーブルの値で更新)
UPDATE 受注
SET    担当者名 = (
  SELECT 氏名 FROM 社員 WHERE 社員ID = 受注.担当者ID
)
WHERE  担当者名 IS NULL;
WHERE を忘れると全行が更新される。本番実行前に同じ WHERE で SELECT して対象行を確認する習慣をつけること。
-- 条件付き削除
DELETE FROM 顧客
WHERE  顧客ID = 'C10';

-- 他テーブルを参照する削除
DELETE FROM 受注
WHERE  顧客ID IN (
  SELECT 顧客ID FROM 顧客 WHERE 区分 = '解約'
);
全行削除の方法の比較
観点TRUNCATE TABLEDELETE FROM(WHERE なし)
分類DDL(多くの DB)DML
速度高速(ページ単位削除)遅い(行単位・ログ記録)
ROLLBACK❌ 不可(多くの DBMS)✅ 可(トランザクション内)
WHERE 条件❌ 使えない✅ 使える
自動採番リセット✅ リセット❌ リセットしない
MERGE INTO 顧客 T              -- ターゲット
USING 新規顧客 S               -- ソース
  ON (T.顧客ID = S.顧客ID)
WHEN MATCHED THEN             -- 一致した場合 → 更新
  UPDATE SET T.顧客名 = S.顧客名,
             T.更新日 = CURRENT_DATE
WHEN NOT MATCHED THEN         -- 一致しない場合 → 挿入
  INSERT (顧客ID, 顧客名) VALUES (S.顧客ID, S.顧客名);
MERGE は「あれば UPDATE、なければ INSERT」の UPSERT 操作。DWH へのデータ同期やマスタ更新で多用する。

📝 理解度チェック

WHERE 句を省略した UPDATE 文の動作はどれか?
TRUNCATE TABLE と DELETE FROM(WHERE なし)の主な違いはどれか?
MERGE 文の説明として正しいのはどれか?

読了ボタンを押すとトップページの進捗に反映されます