SQL CRUD 操作完整指南:INSERT、UPDATE、DELETE 語法教學【2025】

SQL CRUD 操作完整指南:INSERT、UPDATE、DELETE 語法教學【2025】
CRUD 是資料庫操作的四個基本動作:Create(新增)、Read(讀取)、Update(更新)、Delete(刪除)。其中 Read 使用 SELECT 語句(已在其他文章詳述),而 Create、Update、Delete 則分別對應 SQL 的 INSERT、UPDATE、DELETE 指令。
這三個指令屬於 DML(Data Manipulation Language,資料操作語言),是每位開發者必須熟練掌握的基礎技能。本文將系統性介紹這些指令的語法結構、進階用法與安全注意事項,幫助你正確且安全地操作資料庫資料。
插圖:SQL CRUD 操作流程圖,展示 INSERT、UPDATE、DELETE 對資料表的影響
場景描述: 流程圖展示資料表在經過 INSERT 新增、UPDATE 更新、DELETE 刪除操作後的資料變化,以視覺化方式呈現 CRUD 概念。
視覺重點:
- 主要內容清晰呈現
必須出現的元素:
- 依據描述中的關鍵元素
需要顯示的中文字: 無
顏色調性: 專業、清晰
避免元素: 抽象圖形、齒輪、發光特效
Slug:
sql-crud-operations-flow-diagram
CRUD 操作概述
在開始學習各指令之前,先了解 DML 指令的共同特性:
DML 指令特性
| 特性 | 說明 |
|---|---|
| 可回滾 | 在交易(Transaction)中執行時,可以 ROLLBACK 還原 |
| 觸發 Trigger | 可能觸發資料表上定義的觸發器 |
| 產生日誌 | 每筆操作都會記錄在交易日誌中 |
| 鎖定資源 | 執行時會對相關資料列或頁面加鎖 |
操作前的安全建議
重要原則:異動資料前,務必先確認影響範圍!
-- ❌ 危險:直接執行 UPDATE/DELETE
DELETE FROM Orders WHERE Status = 'Cancelled';
-- ✅ 安全:先用 SELECT 確認影響範圍
SELECT * FROM Orders WHERE Status = 'Cancelled';
-- 確認資料正確後,再執行 DELETE
INSERT 新增資料
INSERT 語句用於在資料表中新增一筆或多筆資料。
基本語法
-- 語法一:指定欄位名稱(推薦)
INSERT INTO 表格名稱 (欄位1, 欄位2, 欄位3)
VALUES (值1, 值2, 值3);
-- 語法二:省略欄位名稱(需按表格欄位順序)
INSERT INTO 表格名稱
VALUES (值1, 值2, 值3, ...);
單筆新增範例
-- 新增一筆員工資料
INSERT INTO Employees (EmployeeID, Name, Email, DepartmentID, HireDate)
VALUES (101, 'Alice Chen', '[email protected]', 1, '2025-01-15');
-- 使用 DEFAULT 關鍵字插入預設值
INSERT INTO Employees (EmployeeID, Name, Email, DepartmentID, HireDate)
VALUES (102, 'Bob Wang', '[email protected]', DEFAULT, GETDATE());
批量新增(多筆資料)
一次插入多筆資料,效能比逐筆插入高出許多:
-- 批量新增多筆資料
INSERT INTO Products (ProductName, Price, CategoryID)
VALUES
('商品A', 100, 1),
('商品B', 200, 1),
('商品C', 150, 2),
('商品D', 300, 2),
('商品E', 250, 3);
效能比較:
| 方式 | 10,000 筆資料 | 說明 |
|---|---|---|
| 逐筆 INSERT | ~30 秒 | 每筆都是獨立交易 |
| 批量 INSERT | ~1 秒 | 單一交易處理多筆 |
INSERT INTO SELECT
從其他表格或查詢結果匯入資料:
-- 從查詢結果新增資料
INSERT INTO ArchivedOrders (OrderID, CustomerID, OrderDate, TotalAmount)
SELECT OrderID, CustomerID, OrderDate, TotalAmount
FROM Orders
WHERE OrderDate < '2024-01-01';
-- 搭配條件篩選
INSERT INTO VIPCustomers (CustomerID, CustomerName, TotalSpent)
SELECT CustomerID, CustomerName, SUM(Amount)
FROM Customers c
JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, c.CustomerName
HAVING SUM(Amount) > 100000;
處理自動遞增欄位
當表格有自動遞增(IDENTITY / AUTO_INCREMENT)欄位時:
-- SQL Server:取得新插入的 ID
INSERT INTO Employees (Name, Email)
VALUES ('Carol Lee', '[email protected]');
SELECT SCOPE_IDENTITY() AS NewEmployeeID;
-- MySQL:取得新插入的 ID
INSERT INTO Employees (Name, Email)
VALUES ('Carol Lee', '[email protected]');
SELECT LAST_INSERT_ID() AS NewEmployeeID;
INSERT 常見錯誤
| 錯誤類型 | 原因 | 解決方案 |
|---|---|---|
| 主鍵重複 | 插入已存在的主鍵值 | 檢查主鍵值或使用 UPSERT |
| 外鍵違反 | 參照的外鍵值不存在 | 先確認父表有對應資料 |
| NOT NULL 違反 | 必填欄位未提供值 | 提供值或設定預設值 |
| 資料型別不符 | 值與欄位型別不匹配 | 使用 CAST/CONVERT 轉換 |
UPDATE 更新資料
UPDATE 語句用於修改資料表中既有的資料。
基本語法
UPDATE 表格名稱
SET 欄位1 = 新值1,
欄位2 = 新值2
WHERE 條件;
警告: UPDATE 若不加 WHERE 條件,將會更新表格中的所有資料!
基本更新範例
-- 更新單一欄位
UPDATE Employees
SET Email = '[email protected]'
WHERE EmployeeID = 101;
-- 更新多個欄位
UPDATE Employees
SET
DepartmentID = 2,
Salary = Salary * 1.1, -- 調薪 10%
UpdatedAt = GETDATE()
WHERE EmployeeID = 101;
條件更新
搭配各種條件進行精確更新:
-- 使用 IN 條件
UPDATE Products
SET IsActive = 0
WHERE CategoryID IN (5, 6, 7);
-- 使用 BETWEEN 條件
UPDATE Orders
SET Discount = 0.1
WHERE OrderDate BETWEEN '2025-01-01' AND '2025-01-31';
-- 使用 LIKE 條件
UPDATE Customers
SET CustomerType = 'Enterprise'
WHERE CompanyName LIKE '%Corp%' OR CompanyName LIKE '%Inc%';
使用運算式更新
-- 數值運算
UPDATE Products
SET Price = Price * 0.9 -- 全面 9 折
WHERE CategoryID = 1;
-- 字串處理
UPDATE Customers
SET Email = LOWER(Email); -- 將 Email 轉為小寫
-- 條件運算(CASE WHEN)
UPDATE Employees
SET Bonus = CASE
WHEN Performance >= 90 THEN Salary * 0.2
WHEN Performance >= 80 THEN Salary * 0.1
ELSE Salary * 0.05
END;
JOIN UPDATE(跨表更新)
根據其他表格的資料來更新:
-- SQL Server 語法
UPDATE e
SET e.DepartmentName = d.DepartmentName
FROM Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID;
-- MySQL 語法
UPDATE Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID
SET e.DepartmentName = d.DepartmentName;
-- 標準 SQL(使用子查詢)
UPDATE Employees
SET DepartmentName = (
SELECT DepartmentName
FROM Departments
WHERE Departments.DepartmentID = Employees.DepartmentID
)
WHERE DepartmentID IS NOT NULL;
UPDATE 安全實踐
-- 步驟 1:先用 SELECT 確認影響範圍
SELECT EmployeeID, Name, Salary
FROM Employees
WHERE DepartmentID = 1 AND HireDate < '2024-01-01';
-- 結果:5 筆資料
-- 步驟 2:確認無誤後,執行 UPDATE
UPDATE Employees
SET Salary = Salary * 1.05
WHERE DepartmentID = 1 AND HireDate < '2024-01-01';
-- 訊息:5 筆資料受影響(與預期一致)
DELETE 刪除資料
DELETE 語句用於從資料表中刪除資料。
基本語法
DELETE FROM 表格名稱
WHERE 條件;
警告: DELETE 若不加 WHERE 條件,將會刪除表格中的所有資料!
基本刪除範例
-- 刪除單筆資料
DELETE FROM Employees
WHERE EmployeeID = 101;
-- 刪除符合條件的多筆資料
DELETE FROM Orders
WHERE OrderDate < '2020-01-01' AND Status = 'Completed';
-- 刪除使用 IN 條件
DELETE FROM Products
WHERE ProductID IN (1001, 1002, 1003);
搭配子查詢刪除
-- 刪除沒有訂單的客戶
DELETE FROM Customers
WHERE CustomerID NOT IN (
SELECT DISTINCT CustomerID FROM Orders
);
-- 使用 EXISTS(效能較佳)
DELETE FROM Customers c
WHERE NOT EXISTS (
SELECT 1 FROM Orders o WHERE o.CustomerID = c.CustomerID
);
JOIN DELETE(跨表刪除)
-- SQL Server:刪除特定部門的所有員工
DELETE e
FROM Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE d.DepartmentName = '已裁撤部門';
-- MySQL 語法
DELETE e
FROM Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE d.DepartmentName = '已裁撤部門';
DELETE vs TRUNCATE
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| 語法 | DELETE FROM 表格 WHERE 條件 | TRUNCATE TABLE 表格 |
| WHERE 條件 | 支援 | 不支援(只能刪除全部) |
| 執行速度 | 較慢(逐列刪除) | 極快(重置表格) |
| 交易日誌 | 記錄每列刪除 | 最小化記錄 |
| 可回滾 | 可以(在交易中) | 視資料庫而定 |
| 觸發 Trigger | 會 | 不會 |
| 重置 IDENTITY | 不會 | 會(重新從 1 開始) |
| 外鍵限制 | 可執行(若無違反) | 有外鍵參照時無法執行 |
-- DELETE:刪除所有資料但保留 IDENTITY 計數
DELETE FROM TempData;
-- TRUNCATE:清空表格並重置 IDENTITY
TRUNCATE TABLE TempData;
安全刪除策略
軟刪除(Soft Delete): 不真正刪除資料,而是標記為已刪除
-- 表格設計:加入 IsDeleted 欄位
ALTER TABLE Customers ADD IsDeleted BIT DEFAULT 0;
ALTER TABLE Customers ADD DeletedAt DATETIME NULL;
-- 軟刪除操作
UPDATE Customers
SET IsDeleted = 1, DeletedAt = GETDATE()
WHERE CustomerID = 1001;
-- 查詢時排除已刪除資料
SELECT * FROM Customers WHERE IsDeleted = 0;
交易控制確保資料完整性
執行 INSERT、UPDATE、DELETE 時,使用交易(Transaction)可以確保資料完整性。
基本交易語法
-- 開始交易
BEGIN TRANSACTION;
-- 執行操作
UPDATE Accounts SET Balance = Balance - 1000 WHERE AccountID = 'A001';
UPDATE Accounts SET Balance = Balance + 1000 WHERE AccountID = 'A002';
-- 確認無誤後提交
COMMIT TRANSACTION;
-- 或者發生錯誤時回滾
-- ROLLBACK TRANSACTION;
搭配錯誤處理
BEGIN TRANSACTION;
BEGIN TRY
-- 扣款
UPDATE Accounts
SET Balance = Balance - 1000
WHERE AccountID = 'A001';
-- 檢查餘額是否足夠
IF (SELECT Balance FROM Accounts WHERE AccountID = 'A001') < 0
THROW 50001, '餘額不足', 1;
-- 入款
UPDATE Accounts
SET Balance = Balance + 1000
WHERE AccountID = 'A002';
COMMIT TRANSACTION;
PRINT '轉帳成功';
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
PRINT '轉帳失敗:' + ERROR_MESSAGE();
END CATCH;
大量資料更新的分批處理
更新大量資料時,建議分批處理以避免長時間鎖定:
DECLARE @BatchSize INT = 1000;
DECLARE @RowsAffected INT = 1;
WHILE @RowsAffected > 0
BEGIN
UPDATE TOP (@BatchSize) Orders
SET Status = 'Archived'
WHERE OrderDate < '2020-01-01' AND Status = 'Completed';
SET @RowsAffected = @@ROWCOUNT;
-- 可選:加入延遲避免資源競爭
WAITFOR DELAY '00:00:01';
END
常見錯誤與注意事項
1. 忘記 WHERE 條件
-- ❌ 災難性錯誤:更新所有資料
UPDATE Employees SET Salary = 50000;
-- ❌ 災難性錯誤:刪除所有資料
DELETE FROM Orders;
-- ✅ 正確:加上 WHERE 條件
UPDATE Employees SET Salary = 50000 WHERE EmployeeID = 101;
2. 外鍵約束違反
-- 錯誤:刪除有子記錄的父記錄
DELETE FROM Departments WHERE DepartmentID = 1;
-- 錯誤訊息:The DELETE statement conflicted with the REFERENCE constraint
-- 解決方案 1:先刪除子記錄
DELETE FROM Employees WHERE DepartmentID = 1;
DELETE FROM Departments WHERE DepartmentID = 1;
-- 解決方案 2:使用 CASCADE DELETE(需在表格定義時設定)
3. 資料型別不匹配
-- 錯誤:字串與數字比較
DELETE FROM Products WHERE ProductID = '100'; -- ProductID 是 INT
-- 正確:使用正確的資料型別
DELETE FROM Products WHERE ProductID = 100;
4. NULL 值處理
-- 錯誤:NULL 不能用 = 比較
UPDATE Employees SET ManagerID = 1 WHERE ManagerID = NULL;
-- 正確:使用 IS NULL
UPDATE Employees SET ManagerID = 1 WHERE ManagerID IS NULL;
常見問題 FAQ
Q1:DELETE 和 TRUNCATE 有什麼差別?
DELETE 是 DML 語句,可以搭配 WHERE 條件刪除特定資料,每刪除一列都會記錄在交易日誌中,可以在交易中回滾,且會觸發 DELETE Trigger。TRUNCATE 是 DDL 語句,只能刪除表格中的所有資料(不支援 WHERE),執行速度極快因為它本質上是「重置表格」而非逐列刪除,日誌記錄最小化,且會重置 IDENTITY 欄位的計數器。選擇建議:需要條件刪除或保留審計軌跡用 DELETE;清空整個表格且不需要回滾用 TRUNCATE。
Q2:如何安全地更新大量資料?
更新大量資料的安全步驟:(1) 先用 SELECT 確認:將 UPDATE 的 WHERE 條件套用在 SELECT,確認影響的資料筆數與內容正確;(2) 使用交易:將 UPDATE 包在 BEGIN TRANSACTION 中,確認結果後再 COMMIT,有問題可 ROLLBACK;(3) 分批處理:大量更新時使用 UPDATE TOP (N) 搭配迴圈分批處理,避免長時間鎖定表格影響其他使用者;(4) 備份資料:重要更新前先備份相關資料,或使用 OUTPUT 子句記錄變更前後的值;(5) 離峰執行:大量更新盡量安排在系統負載低的時段執行。
延伸學習資源
深入學習 SQL 資料操作技巧,建議參考以下資源:
SQL 基礎語法:
- SQL 完整指南:從入門到精通的資料庫查詢語言教學
- SQL 語法大全:SELECT、JOIN、WHERE 完整查詢指令教學
- SQL JOIN 完整教學:INNER、LEFT、RIGHT、FULL JOIN 圖解
- SQL 函數完整指南:字串、日期、數學、聚合函數總整理
進階技巧:
結論
INSERT、UPDATE、DELETE 是 SQL 資料操作的三大核心指令,熟練掌握這些語法是資料庫開發的基本功。重點回顧:
- INSERT:新增資料,善用批量插入提升效能
- UPDATE:更新資料,務必加 WHERE 條件
- DELETE:刪除資料,務必加 WHERE 條件,了解與 TRUNCATE 的差異
- 交易控制:重要操作使用 Transaction 確保資料完整性
- 安全原則:執行前先用 SELECT 確認影響範圍
記住:資料操作的錯誤往往是不可逆的,養成「先確認再執行」的習慣,能讓你避免許多不必要的麻煩。
想要快速查閱 CRUD 語法? — 下載我們整理的 SQL CRUD 語法範本,包含 INSERT、UPDATE、DELETE 各種常用語法與範例,方便日常開發參考。
參考資料
- Microsoft INSERT Documentation - https://docs.microsoft.com/sql/t-sql/statements/insert-transact-sql
- Microsoft UPDATE Documentation - https://docs.microsoft.com/sql/t-sql/queries/update-transact-sql
- Microsoft DELETE Documentation - https://docs.microsoft.com/sql/t-sql/statements/delete-transact-sql
- MySQL DML Statements - https://dev.mysql.com/doc/refman/8.0/en/sql-data-manipulation-statements.html
- PostgreSQL DML Commands - https://www.postgresql.org/docs/current/dml.html
相關文章
雲端 SQL 資料庫比較:Azure SQL、Cloud SQL、AWS RDS 完整評比【2025】
全面比較三大雲端 SQL 資料庫服務:Azure SQL Database、Google Cloud SQL、AWS RDS。涵蓋功能特色、高可用性、定價模式、遷移策略,幫助企業選擇最適合的雲端資料庫方案。
SQLSQL 函數完整指南:字串、日期、數學、聚合函數總整理【2025】
SQL 內建函數完整參考手冊。涵蓋字串函數(CONCAT、SUBSTRING、REPLACE)、日期函數(DATEADD、DATEDIFF)、數學函數(ROUND、CEILING)、聚合函數(COUNT、SUM、AVG)的語法與範例。
SQLSQL Injection 完整攻防指南:原理解析與防範實戰【2025】
深入解析 SQL Injection 攻擊原理與防範策略。涵蓋 Classic、Blind、Union-based 攻擊類型、參數化查詢實作、WAF 防護設定,以及 SQLMap 安全測試工具使用教學。