INSERT/UPDATE/DELETE/MERGE の完全ガイドと落とし穴
Data Manipulation Language — テーブルのデータを操作する SQL 命令の総称。INSERT・UPDATE・DELETE・MERGE が含まれる。
| 分類 | 命令 | 役割 |
|---|---|---|
| DDL | CREATE/ALTER/DROP | テーブル構造の定義・変更 |
| DML | INSERT/UPDATE/DELETE/MERGE | データの操作 |
| DCL | GRANT/REVOKE | アクセス権の制御 |
| TCL | COMMIT/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;
-- 条件付き削除 DELETE FROM 顧客 WHERE 顧客ID = 'C10'; -- 他テーブルを参照する削除 DELETE FROM 受注 WHERE 顧客ID IN ( SELECT 顧客ID FROM 顧客 WHERE 区分 = '解約' );
| 観点 | TRUNCATE TABLE | DELETE 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.顧客名);
読了ボタンを押すとトップページの進捗に反映されます