--- title: "09-数据的增删改" created: 2026-01-07 tags: - 项目筑基 --- # 数据的增删改 ## **第七章:数据维护(增删改查)** > 💡 本章是MySQL实际操作的核心,涵盖DML(数据操纵语言)的所有内容:INSERT、DELETE、UPDATE、SELECT ### **7.1 概述** ![[image-cb8e9a4a.png]] | **操作** | **语句** | **说明** | | --- | --- | --- | | **增** | INSERT | 向表中插入新数据 | | **删** | DELETE | 从表中删除数据 | | **改** | UPDATE | 修改表中已有数据 | | **查** | SELECT | 查询表中数据 | ### **7.2 INSERT 插入数据** #### **7.2.1 按列名插入(一一对应式)** ```sql INSERT INTO 选课成绩(学号, 课程编号) VALUES ('U201701002', '2017-2018'); ``` #### **7.2.2 不指定列名插入** ```sql -- 教师表有七个属性 INSERT INTO 教师 VALUES ('T013', '徐强', '男', '1993-07-01', '助教', '02', '19920701'); -- 必须按顺序插入七个数据 ``` > ⚠️ **注意**:不指定列名时,VALUES 中的值必须与表结构中的列顺序完全一致! #### **7.2.3 一次插入多条记录** ```sql -- MySQL 支持一次插入多行(比逐条插入效率高!) INSERT INTO 选课成绩(学号, 课程编号) VALUES ('U201701002', '2017-2018-2-B009'), ('U201701003', '2017-2018-2-B009'), ('U201701001', '2017-2018-2-B009'); ``` | **数据库** | **多行插入方式** | | --- | --- | | **SQL Server** | 需要多条 INSERT 语句 | | **MySQL** | 一条语句可插入多行,用逗号分隔,效率更高 | #### **7.2.4 对已存在的列补充数据** ```sql -- ✗ 错误用法:INSERT 无法单独更新某列 INSERT INTO 教师(籍贯) VALUES ('江西上饶'); -- ✓ 正确用法:使用 UPDATE 语句 UPDATE 教师 SET 籍贯 = '江西抚州' WHERE 姓名 = '徐强'; ``` #### **7.2.5 NULL 值的插入** ```sql -- 直接写 NULL(不加引号) INSERT INTO 教师 VALUES ('T018', '小宇', '男', '助教', '02', NULL, '山东德州'); -- 验证真正的 NULL SELECT * FROM 教师 WHERE 密码 IS NULL; -- ✓ 正确:查找真正的空值 SELECT * FROM 教师 WHERE 密码 = 'NULL'; -- ✗ 这是查找字符串 'NULL' ``` > 💡 **此空非彼空!** > > | **值** | **含义** | > | --- | --- | > | `NULL` | 真正的空值,表示"未知"或"不存在" | > | `'NULL'` | 字符串,内容是四个字母 N-U-L-L | > | `''` | 空字符串,长度为0的字符串 | > > 判断空值只能用 `IS NULL`,不能用 \= NULL #### **7.2.6 INSERT 与图形化工具的选择** | **场景** | **推荐方式** | | --- | --- | | 少量数据 | MySQL Workbench 手动编辑 | | 批量数据 | INSERT INTO ... VALUES 多行插入 | | 大量数据 | LOAD DATA INFILE 导入文件 | ### **7.3 DELETE 删除数据** #### **7.3.1 删除表中全部数据** ```sql DELETE FROM 表名; -- 或者使用 TRUNCATE(更快,但不可回滚) TRUNCATE TABLE 表名; ``` #### **7.3.2 删除特定数据** ```sql -- 使用 WHERE 条件 DELETE FROM 学院 WHERE LENGTH(学院电话) < 8; -- 删除指定记录 DELETE FROM 教师 WHERE 教师编号 = 'T013'; ``` #### **7.3.3 DELETE vs DROP vs TRUNCATE** | **操作** | **作用** | **保留结构** | **可加WHERE** | **可回滚** | | --- | --- | --- | --- | --- | | `DELETE FROM 表名` | 删除数据 | ✓ | ✓ | ✓ | | `TRUNCATE TABLE 表名` | 清空数据 | ✓ | ✗ | ✗ | | `DROP TABLE 表名` | 删除整个表 | ✗ | ✗ | ✗ | > 💡 **记忆技巧**:记录用 DELETE,其他用 DROP ### **7.4 UPDATE 修改数据** #### **7.4.1 修改指定数据** ```sql -- 通过编号修改 UPDATE 教师 SET 性别 = '女' WHERE 教师编号 = 'T013'; -- 通过姓名修改(只要能确定记录即可) UPDATE 教师 SET 性别 = '男' WHERE 姓名 = '徐强'; ``` #### **7.4.2 对一组数据进行有规律的修改** ```sql -- 所有成绩打九折 UPDATE 选课成绩 SET 成绩 = 成绩 * 0.9; -- 查看修改结果 SELECT * FROM 选课成绩; ``` #### **7.4.3 挑选某些数据进行修改** ```sql -- 把长度小于等于8的学院电话前面加上027 -- MySQL 使用 CONCAT() 进行字符串连接 UPDATE 学院 SET 学院电话 = CONCAT('027-', 学院电话) WHERE LENGTH(学院电话) <= 8; ``` | **数据库** | **字符串连接方式** | | --- | --- | | **SQL Server** | `'027-' + 学院电话` | | **MySQL** | `CONCAT('027-', 学院电话)` | > ⚠️ MySQL 的 `+` 只用于数值运算,字符串连接必须用 `CONCAT()` #### **7.4.4 修改多个字段** ```sql UPDATE 教师 SET 性别 = '男', 职称 = '讲师', 籍贯 = '江西南昌' WHERE 姓名 = '徐强'; ``` --- ⬅️ [[08-数据表的修改与删除|数据表的修改与删除]] 🏠 [[00-数据库|00-数据库]] ➡️ [[10-单表与条件查询|单表与条件查询]]