首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 四大核心 DML 語句全解析:INSERT、SELECT、UPDATE、DELETE

     編輯:MySQL 資料庫相關知識

DML 與 DDL 的分野

DDL (Data Definition Language):CREATE/ALTER/DROP TABLE 定義結構,不處理數據行。
DML (Data Manipulation Language):INSERT/SELECT/UPDATE/DELETE 操作具體數據,是日常開發 90%+ 的工作內容。

示例表:EMPLOYEES

CREATE TABLE EMPLOYEES (
    emp_id    INT PRIMARY KEY,
    name      VARCHAR(50) NOT NULL,
    dept_id   INT,
    salary    DECIMAL(10,2),
    hire_date DATE
);

1. INSERT:插入新行

完整列插入

INSERT INTO EMPLOYEES (emp_id, name, dept_id, salary, hire_date)
VALUES (101, '張三', 10, 8500.00, '2020-03-15');

指定列插入(其餘列取默認值或 NULL)

INSERT INTO EMPLOYEES (emp_id, name, hire_date)
VALUES (102, '李四', '2021-07-01');

多行批量插入(高效)

INSERT INTO EMPLOYEES (emp_id, name, dept_id, salary, hire_date)
VALUES
(103, '王五', 20, 9200.00, '2019-11-01'),
(104, '趙六', 20, 8800.00, '2022-01-10'),
(105, '孫七', 30, 12000.00, '2018-05-20');

INSERT ... SELECT(從其他表複製)

INSERT INTO EMPLOYEES_ARCHIVE
SELECT * FROM EMPLOYEES WHERE hire_date < '2015-01-01';

2. SELECT:查詢與投影

基礎語法

SELECT [DISTINCT] select_list
FROM table_references
[WHERE where_condition]
[GROUP BY group_list]
[HAVING having_condition]
[ORDER BY order_list [ASC|DESC]]
[LIMIT [offset,] row_count];

常用子句示例

  • 投影別名:SELECT emp_id AS id, name AS employee_name FROM EMPLOYEES;
  • 表達式:SELECT name, salary * 12 AS annual_salary FROM EMPLOYEES;
  • 聚合:SELECT dept_id, AVG(salary) FROM EMPLOYEES GROUP BY dept_id HAVING AVG(salary) > 9000;
  • 分頁:SELECT * FROM EMPLOYEES ORDER BY hire_date DESC LIMIT 10 OFFSET 20;

3. UPDATE:修改現有行

單表更新

UPDATE EMPLOYEES
SET salary = salary * 1.1, dept_id = 30
WHERE emp_id = 101;

多表更新(MySQL 語法)

UPDATE EMPLOYEES e
JOIN DEPARTMENTS d ON e.dept_id = d.dept_id
SET e.salary = e.salary * 1.05
WHERE d.name = '研發部';

⚠️ 必須帶 WHERE,否則全表更新!

4. DELETE:刪除行

條件刪除

DELETE FROM EMPLOYEES WHERE dept_id = 99;

多表刪除(MySQL)

DELETE e FROM EMPLOYEES e
JOIN DEPARTMENTS d ON e.dept_id = d.dept_id
WHERE d.status = 'closed';

TRUNCATE TABLE(清空表,非 DML,不可回滾,重置自增)

TRUNCATE TABLE EMPLOYEES;

連接查詢:多表關聯的核心

類型語法語義結果行數
內連接INNER JOIN / JOIN僅返回匹配行≤ 兩表行數最小值
左外連接LEFT [OUTER] JOIN左表全保留,右表無匹配填 NULL= 左表行數
右外連接RIGHT [OUTER] JOIN右表全保留= 右表行數
全外連接FULL [OUTER] JOIN雙表全保留(MySQL 不支持,用 UNION 模擬)≥ 兩表行數最大值
交叉連接CROSS JOIN笛卡爾積(無 ON 條件)= 兩表行數乘積

標準 SQL-92 FROM 子句語法

FROM table1
INNER JOIN table2 ON table1.col = table2.col
LEFT JOIN table3 ON table1.col = table3.col
CROSS JOIN table4;

推薦:連接條件放 ON,過濾條件放 WHERE,語義清晰、優化器友好。

不能直接連接的類型

TEXT、NTEXT、IMAGE(SQL Server)/ BLOB/TEXT(MySQL)不可直接作連接鍵。
變通:ON DATALENGTH(t1.blob_col) = DATALENGTH(t2.blob_col) 或比較哈希值。

三值邏輯與比較運算符

  • TRUE / FALSE / UNKNOWN:任何與 NULL 比較結果為 UNKNOWN。
  • WHERE col = NULL 永遠不返回行 → 必須用 IS NULL。
  • NOT (col = NULL) 也不返回行 → 用 IS NOT NULL。

總結:DML 操作檢查清單

操作必做禁忌
INSERT顯式列名、批量提交、事務包裹隱式列順序依賴、單行循環提交
SELECT避免 SELECT *、善用覆蓋索引、LIMIT 分頁無 WHERE 全表掃描、SELECT * 過網絡
UPDATEWHERE 精確鎖定、受影響行數預估、事務無 WHERE、大事務長鎖定、子查詢未驗證
DELETEWHERE 精確、先 SELECT 驗證、歸檔備份無 WHERE、直接刪大表、無外鍵級聯評估

結語

掌握 INSERT/SELECT/UPDATE/DELETE 四大 DML 及連接查詢,是 SQL 進階的門檻。記住:顯式優於隱式、集合優於迭代、約束優於信任。每次寫 DML 前,先在腦中跑一遍「影響多少行?會鎖住什麼?索引能用上嗎?有無事務保護?」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved