Skip to content

第6章:DML 数据操纵语言

6.1 插入数据(INSERT)

基本语法

sql
-- 插入单条数据(指定字段)
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);

-- 插入单条数据(所有字段)
INSERT INTO 表名 VALUES (值1, 值2, ...);

-- 插入多条数据
INSERT INTO 表名 (字段1, 字段2, ...) VALUES 
(值1, 值2, ...),
(值1, 值2, ...),
...;

示例

sql
-- 创建测试表
CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    gender ENUM('男', '女') DEFAULT '男',
    age INT,
    class VARCHAR(20),
    score DECIMAL(5, 2)
);

-- 插入单条数据(指定字段)
INSERT INTO students (name, gender, age, class, score) 
VALUES ('张三', '男', 18, '一班', 85.50);

-- 插入单条数据(所有字段,包括自增ID)
INSERT INTO students VALUES (2, '李四', '女', 19, '二班', 92.00);

-- 插入多条数据(推荐)
INSERT INTO students (name, gender, age, class, score) VALUES
('王五', '男', 18, '一班', 78.50),
('赵六', '女', 20, '三班', 88.00),
('孙七', '男', 19, '二班', 95.50),
('周八', '女', 18, '一班', 82.00);

注意事项

  1. 字段与值一一对应
sql
-- 正确:字段顺序与值顺序一致
INSERT INTO students (name, age, gender) VALUES ('张三', 18, '男');

-- 错误:顺序不一致
INSERT INTO students (name, age, gender) VALUES ('张三', '男', 18);  -- 错误!
  1. 字符串加引号
sql
-- 正确
INSERT INTO students (name) VALUES ('张三');

-- 错误:字符串未加引号
INSERT INTO students (name) VALUES (张三);  -- 错误!
  1. 自增字段处理
sql
-- 方式1:不指定自增字段,数据库自动生成
INSERT INTO students (name, age) VALUES ('张三', 18);

-- 方式2:指定为 NULL,数据库自动生成
INSERT INTO students VALUES (NULL, '张三', '男', 18, '一班', 85.50);

-- 方式3:指定具体值(不推荐)
INSERT INTO students VALUES (100, '张三', '男', 18, '一班', 85.50);
  1. 批量插入优化
sql
-- 推荐:一次性插入多条数据(性能更好)
INSERT INTO students (name, age) VALUES
('张三', 18),
('李四', 19),
('王五', 18);

-- 不推荐:多次单条插入(性能较差)
INSERT INTO students (name, age) VALUES ('张三', 18);
INSERT INTO students (name, age) VALUES ('李四', 19);
INSERT INTO students (name, age) VALUES ('王五', 18);

6.2 修改数据(UPDATE)

基本语法

sql
UPDATE 表名 
SET 字段1 = 值1, 字段2 = 值2, ...
[WHERE 条件];

示例

sql
-- 修改单条数据
UPDATE students SET score = 90.00 WHERE id = 1;

-- 修改多条数据
UPDATE students SET class = '一班(重点)' WHERE class = '一班';

-- 修改多个字段
UPDATE students 
SET age = 20, score = 88.50 
WHERE name = '张三';

-- 所有数据增加年龄(无条件,慎用!)
UPDATE students SET age = age + 1;

注意事项

⚠️ 重要:必须加 WHERE 条件!

sql
-- 危险操作:忘记加 WHERE,会修改所有数据!
UPDATE students SET score = 100;  -- 所有学生成绩都变成100!

-- 正确做法:先查询确认
SELECT * FROM students WHERE id = 1;

-- 再执行更新
UPDATE students SET score = 100 WHERE id = 1;

安全更新模式

sql
-- 查看安全更新模式
SHOW VARIABLES LIKE 'sql_safe_updates';

-- 开启安全更新模式(防止无WHERE的UPDATE/DELETE)
SET sql_safe_updates = 1;

-- 开启后,以下语句会报错
UPDATE students SET score = 100;  -- 错误:没有WHERE条件

-- 必须使用WHERE或LIMIT
UPDATE students SET score = 100 WHERE id = 1;
UPDATE students SET score = 100 LIMIT 1;

6.3 删除数据(DELETE)

基本语法

sql
DELETE FROM 表名 [WHERE 条件];

示例

sql
-- 删除单条数据
DELETE FROM students WHERE id = 1;

-- 删除多条数据
DELETE FROM students WHERE class = '三班';

-- 删除所有数据(谨慎!)
DELETE FROM students;

DELETE vs TRUNCATE

特性DELETETRUNCATE
速度较慢(逐行删除)较快(删除整个表再重建)
回滚支持事务回滚不支持
触发器会触发触发器不会触发
自增ID继续递增重置为1
WHERE条件支持不支持
sql
-- DELETE:删除数据,保留表结构
DELETE FROM students WHERE id = 1;

-- TRUNCATE:清空表,重置自增ID
TRUNCATE TABLE students;

注意事项

⚠️ 重要:删除前务必确认!

sql
-- 安全删除流程
-- 1. 先查询确认要删除的数据
SELECT * FROM students WHERE id = 1;

-- 2. 确认无误后再删除
DELETE FROM students WHERE id = 1;

-- 3. 验证删除结果
SELECT * FROM students WHERE id = 1;  -- 应该无结果

实操案例

案例:学生成绩管理

1. 准备数据

sql
-- 创建学生表
CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    gender ENUM('男', '女') DEFAULT '男',
    age INT,
    class VARCHAR(20),
    score DECIMAL(5, 2),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 插入测试数据
INSERT INTO students (name, gender, age, class, score) VALUES
('张三', '男', 18, '一班', 85.50),
('李四', '女', 19, '二班', 92.00),
('王五', '男', 18, '一班', 78.50),
('赵六', '女', 20, '三班', 88.00),
('孙七', '男', 19, '二班', 95.50),
('周八', '女', 18, '一班', 82.00),
('吴九', '男', 20, '三班', 76.00),
('郑十', '女', 19, '二班', 91.00);

-- 查看所有数据
SELECT * FROM students;

2. 插入新学生

sql
-- 插入单个学生
INSERT INTO students (name, gender, age, class, score) 
VALUES ('钱十一', '男', 18, '一班', 88.00);

-- 批量插入新生
INSERT INTO students (name, gender, age, class, score) VALUES
('孙十二', '女', 19, '二班', 87.50),
('李十三', '男', 18, '一班', 93.00);

-- 查看插入结果
SELECT * FROM students ORDER BY id DESC LIMIT 5;

3. 修改学生信息

sql
-- 修改张三的成绩
UPDATE students SET score = 90.00 WHERE name = '张三';

-- 修改李四的班级和成绩
UPDATE students 
SET class = '二班(重点)', score = 95.00 
WHERE name = '李四';

-- 所有一班学生成绩加5分
UPDATE students SET score = score + 5 WHERE class = '一班';

-- 查看修改结果
SELECT * FROM students WHERE class LIKE '%一班%';

4. 删除学生

sql
-- 删除特定学生(先查询确认)
SELECT * FROM students WHERE name = '吴九';
DELETE FROM students WHERE name = '吴九';

-- 删除成绩低于80分的学生
SELECT * FROM students WHERE score < 80;
DELETE FROM students WHERE score < 80;

-- 查看剩余数据
SELECT * FROM students;

5. 数据备份与恢复

sql
-- 创建备份表
CREATE TABLE students_backup AS SELECT * FROM students;

-- 查看备份
SELECT * FROM students_backup;

-- 清空原表(测试用)
TRUNCATE TABLE students;

-- 从备份恢复
INSERT INTO students SELECT * FROM students_backup;

-- 验证恢复
SELECT * FROM students;

新手易错点

1. 插入数据类型不匹配

sql
-- 错误:年龄插入字符串
INSERT INTO students (name, age) VALUES ('张三', '十八');  -- 错误!

-- 正确
INSERT INTO students (name, age) VALUES ('张三', 18);

2. 修改/删除未加WHERE条件

sql
-- 危险:会修改/删除所有数据!
UPDATE students SET score = 100;  -- 所有学生成绩都变成100
DELETE FROM students;             -- 删除所有学生

-- 正确:必须加WHERE条件
UPDATE students SET score = 100 WHERE id = 1;
DELETE FROM students WHERE id = 1;

3. 字符串未加单引号

sql
-- 错误:字符串未加引号
INSERT INTO students (name) VALUES (张三);  -- 错误!
UPDATE students SET name = 李四 WHERE id = 1;  -- 错误!

-- 正确
INSERT INTO students (name) VALUES ('张三');
UPDATE students SET name = '李四' WHERE id = 1;

4. 混淆DELETE和DROP

sql
-- DELETE:删除数据,保留表结构
DELETE FROM students;

-- DROP:删除整个表(包括数据和结构)
DROP TABLE students;  -- 危险!表结构也没了

小结

通过本章的学习,你掌握了:

  • ✅ INSERT:插入单条/多条数据
  • ✅ UPDATE:修改数据(必须加WHERE)
  • ✅ DELETE:删除数据(必须加WHERE)
  • ✅ DELETE vs TRUNCATE 的区别
  • ✅ 数据操作的安全注意事项

DML 是操作数据库数据的核心,掌握这些命令对于日常开发至关重要。继续学习 第7章:DQL 数据查询语言

© 2026 编程马·菜鸟教程 版权所有