掌握 INSERT、SELECT、UPDATE、DELETE 四大資料操作語言 (DML) 是使用 SQL 的基石。本文以 Employees 範例表逐步講解語法、資料型別處理、NULL 語意、交易原子性與進階用法。
CREATE TABLE Employees (
EmpID INT IDENTITY(1,1) PRIMARY KEY,
LastName NVARCHAR(50) NOT NULL,
FirstName NVARCHAR(50) NOT NULL,
BirthDate DATE NOT NULL,
City NVARCHAR(50),
Level TINYINT,
Salary DECIMAL(10,2)
);
INSERT INTO Employees (LastName, FirstName, BirthDate, City, Level, Salary)
VALUES (N'Smith', N'John', '1980-06-10', N'Los Angeles', 16, 45000.00);
N'...' (Unicode);數值不加引號。IDENTITY 欄位自動產生,不可指定值(除非 SET IDENTITY_INSERT ON)。INSERT INTO Employees (LastName, FirstName, BirthDate)
VALUES (N'Jones', N'Davy', '1970-10-10'); -- City, Level, Salary 為 NULL
INSERT INTO Employees (LastName, FirstName, BirthDate, City, Level, Salary)
VALUES
(N'Bunyan', N'Paul', '1970-07-04', N'Boston', 12, 70000),
(N'John', N'Adams', '1992-01-21', N'Boston', 20, 100000),
(N'Smith', N'Pocahontas', '1976-04-06', N'Los Angeles', 12, 100000);
單一 INSERT 為隱含交易:任何欄位違反型別/約束/觸發器錯誤,整筆回滾,不會寫入部分資料。
SELECT [ALL | DISTINCT] select_list
FROM table_source
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC]];
-- 全欄位
SELECT * FROM Employees;
-- 指定欄位、別名、條件、排序
SELECT EmpID, LastName + N' ' + FirstName AS FullName, Salary
FROM Employees
WHERE City = N'Boston' AND Salary > 50000
ORDER BY Salary DESC;
-- 聚合與分組
SELECT City, COUNT(*) AS EmpCount, AVG(Salary) AS AvgSalary
FROM Employees
GROUP BY City
HAVING COUNT(*) > 1
ORDER BY AvgSalary DESC;
UPDATE table_name
SET column1 = expression1, column2 = expression2, ...
[WHERE search_condition];
-- 單筆更新
UPDATE Employees SET Salary = 50000, Level = 17 WHERE EmpID = 1;
-- 批次更新:所有 Boston 員工薪資調漲 5%
UPDATE Employees SET Salary = Salary * 1.05 WHERE City = N'Boston';
-- 子查詢更新:同步其他表資料
UPDATE e SET e.City = d.City
FROM Employees e
JOIN Departments d ON e.DeptID = d.DeptID
WHERE d.Location = N'New York';
WHERE 會更新全表,造成災難。WHERE 先查詢受影響列數與資料,確認無誤再執行 UPDATE。WAITFOR DELAY 避免長鎖定。DELETE FROM table_name [WHERE search_condition];
-- 刪除特定員工
DELETE FROM Employees WHERE EmpID = 999;
-- 刪除離職超過 5 年且薪資為 0 的記錄
DELETE FROM Employees WHERE HireDate < DATEADD(YEAR, -5, GETDATE()) AND Salary = 0;
| 特性 | DELETE | TRUNCATE TABLE |
|---|---|---|
| 可用 WHERE | 是 | 否 (全表) |
| 觸發器 | 啟動 AFTER DELETE | 不啟動 |
| IDENTITY 重置 | 否 | 是 (重種子) |
| 記錄檔空間 | 逐列記錄 | 最小記錄 (釋放頁面) |
| 權限 | DELETE 權限 | ALTER TABLE 權限 |
NULL 代表「未知」,非零、非空字串。WHERE Col = NULL 永遠為 UNKNOWN → 用 WHERE Col IS NULL。COUNT(*) 計列數,COUNT(Col) 計非 NULL 值)。ISNULL(Col, 0) / COALESCE(Col1, Col2, 0) 處理顯示與運算。Employees 表並插入 10 筆測試資料。SELECT 組合:篩選、排序、分組、連接。UPDATE 前先 SELECT 驗證,觀察 @@ROWCOUNT。DELETE + ROLLBACK 體驗原子性。四大 DML 是 SQL 的心臟。熟練語法、理解 NULL、善用交易、養成「先查後改」習慣,即能安全高效操作資料。