Skip to content

DML语句


DML(Data Manipulation Language,数据操作语言) 是 SQL 中用于 操作表中数据 的核心部分 —— 不涉及表结构(那是 DDL),只关心“增删改”。

用于向表中添加新行

INSERT INTO 表名 (列1, 列2, ...)
VALUES (值1, 值2, ...);

插入时一定要保证 列的数量VALUES 的数量 一一对应。类型也要尽量匹配,不然会报错或发生隐式转换。

INSERT INTO 表名 (列1, 列2, ...)
VALUES
(值1, 值2, ...),
(值1, 值2, ...);

注意单条 SQL 太大时(比如上百万行)可能超过 max_allowed_packet 限制。

INSERT IGNORE INTO 表名 (列1, 列2, ..., 列N)
VALUES (值1, 值2, ..., 值N);
INSERT INTO 表名 (列1, 列2, ..., 列N)
VALUES (值1, 值2, ..., 值N)
ON DUPLICATE KEY UPDATE
列1 = 新值1,
列2 = 新值2,
...,
列N = 新值N;

ON DUPLICATE KEY UPDATE 只会在主键或唯一索引冲突时触发。

INSERT INTO 目标表 (列1, 列2, ...)
SELECT 表A.列A, 表B.列B, ...
FROM 表A
JOIN 表B ON 表A.关联列 = 表B.关联列
WHERE 条件;

从查询结果插入,不用 VALUES


用于修改已有行的数据

UPDATE 表名 SET 列1 = 值1, 列2 = 值2 WHERE 条件;
UPDATE 表1 [AS 别名1]
JOIN 表2 [AS 别名2] ON 关联条件
[JOIN 表3 ... ON 关联条件]
SET
表1.列1 = 新值1,
表1.列2 = 新值2,
表2.列3 = 新值3
WHERE 条件;

用于删除表中的行

DELETE FROM 表名 WHERE 条件;
DELETE u FROM users u
JOIN logs l ON u.id = l.user_id
WHERE l.action = 'delete';

  1. UPDATE / DELETE 一定要写 WHERE! → 建议开启 sql_safe_updates

  2. 大表 UPDATE/DELETE 分批操作 → 避免长事务、锁表;

DELETE FROM logs WHERE created_at < '2020-01-01' LIMIT 1000;
  1. INSERT 批量比单条快 → 减少网络往返 + 事务开销;

  2. SELECT 避免 SELECT * → 只查需要的列,减少 I/O;

  3. 复杂查询用 EXPLAIN 分析执行计划