返回首頁SQL

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

17 min 分鐘閱讀

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

特性DELETETRUNCATE
語法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 基礎語法:

進階技巧:


結論

INSERT、UPDATE、DELETE 是 SQL 資料操作的三大核心指令,熟練掌握這些語法是資料庫開發的基本功。重點回顧:

  • INSERT:新增資料,善用批量插入提升效能
  • UPDATE:更新資料,務必加 WHERE 條件
  • DELETE:刪除資料,務必加 WHERE 條件,了解與 TRUNCATE 的差異
  • 交易控制:重要操作使用 Transaction 確保資料完整性
  • 安全原則:執行前先用 SELECT 確認影響範圍

記住:資料操作的錯誤往往是不可逆的,養成「先確認再執行」的習慣,能讓你避免許多不必要的麻煩。


想要快速查閱 CRUD 語法? — 下載我們整理的 SQL CRUD 語法範本,包含 INSERT、UPDATE、DELETE 各種常用語法與範例,方便日常開發參考。

免費下載 SQL CRUD 語法範本 →


參考資料

需要專業的雲端建議?

無論您正在評估雲平台、優化現有架構,或尋找節費方案,我們都能提供協助

預約免費諮詢

相關文章