手机号快速查询QQ号:3分钟找回账号的终极指南
2026/5/8 17:45:53
插入数据是数据生命周期的起点,核心作用是向数据表注入原始数据,支撑后续查询、统计、分析等操作。适用于系统初始化(如初始化部门、角色数据)、用户操作提交(如新增订单、注册用户)、数据迁移(如从旧系统同步数据到新系统)等场景。
VALUES直接指定字段值,灵活度高,支持全字段、指定字段、多条记录插入,VALUES为标准写法(可简写为VALUE,但不推荐,兼容性略差)。INSERTINTO表名VALUES(value1,value2,...,valuen);departments表插入全字段数据(表字段顺序:department_id、department_name、manager_id、location_id)-- 正常插入(4个字段均赋值,顺序与表定义一致)INSERTINTOdepartmentsVALUES(70,'Public Relations',100,1700);-- 部分字段为NULL(manager_id和location_id无明确值,需显式写NULL)INSERTINTOdepartmentsVALUES(100,'Finance',NULL,NULL);INSERTINTO表名(column1,column2,...,columnn)VALUES(value1,value2,...,valuen);departments表仅插入department_id和department_name字段INSERTINTOdepartments(department_id,department_name)VALUES(80,'IT');-- manager_id和location_id取表定义的默认值(如NULL)-- 方式A:全字段多条插入INSERTINTO表名VALUES(值组1),(值组2),...,(值组n);-- 方式B:指定字段多条插入INSERTINTO表名(column1,column2,...)VALUES(值组1),(值组2),...,(值组n);emp表插入3条员工记录INSERTINTOemp(emp_id,emp_name)VALUES(1001,'shkstart'),(1002,'atguigu'),(1003,'Tom');Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0Records:实际插入的记录数(与值组数量一致则正常);Duplicates:重复主键/唯一索引的记录数(非0时需检查数据是否重复,避免脏数据);Warnings:数据类型隐式转换的记录数(非0时需排查,如字符串超长被截断、数值类型不匹配)。SELECT查询结果直接插入目标表,无需手动输入每条记录,是“数据迁移/批量同步”的最优方案。INSERTINTO目标表名(tar_column1,tar_column2,...)SELECTsrc_column1,src_column2,...FROM源表名[WHERE条件];VALUES子句,子查询结果直接映射到目标表;CAST函数转换数据类型,如CAST(age AS CHAR));WHERE子句筛选数据,避免插入无用记录。-- 将employees表中department_id=90的所有记录插入emp2表INSERTINTOemp2SELECT*FROMemployeesWHEREdepartment_id=90;-- 将employees表中job_id含REP的记录,同步到sales_reps表INSERTINTOsales_reps(id,name,salary,commission_pct)SELECTemployee_id,last_name,salary,commission_pctFROMemployeesWHEREjob_idLIKE'%REP%';WHERE NOT EXISTS排除重复记录,防止主键冲突。| 错误类型 | 报错表现 | 解决方案 |
|---|---|---|
| 数据类型不匹配 | Data truncation: Truncated incorrect DOUBLE value | 确保值的类型与字段定义一致(如字符串不插入整数字段) |
| 主键/唯一索引重复 | Duplicate entry ‘100’ for key ‘PRIMARY’ | 检查插入值是否重复,或使用INSERT IGNORE忽略重复记录 |
| 字段顺序错误(全字段插入) | 部门名称插入到ID字段,逻辑混乱 | 改用“指定字段插入”,或严格按照表定义顺序赋值 |
| NOT NULL字段未赋值 | Column ‘name’ cannot be null | 为该字段赋值,或设置字段默认值 |
更新数据是修改已有记录的属性,适用于用户信息修改(如修改手机号、地址)、业务状态变更(如订单状态从“待支付”改为“已支付”)、数据校正(如批量修正价格错误)等场景。
UPDATEtable_nameSETcolumn1=value1,column2=value2,...,columnn=valuen[WHEREcondition];SET子句支持多字段更新,用逗号分隔;WHERE子句是“生命线”——省略则更新全表数据,生产环境中99%的全表更新都是事故;SET AUTOCOMMIT = FALSE,执行后验证结果,正确则COMMIT,错误则ROLLBACK。-- 将employee_id=113的员工部门ID改为70(通过主键定位,唯一锁定一条记录)UPDATEemployeesSETdepartment_id=70WHEREemployee_id=113;-- 将名称为EmmaT的书价格改为40,说明改为drama(通过唯一名称定位)UPDATEbooksSETprice=40,note='drama'WHEREname='EmmaT';name字段非唯一,可能更新多条记录,建议先执行SELECT * FROM books WHERE name = 'EmmaT'验证记录数,再执行UPDATE。-- 将所有小说类型(note='novel')的书价格增加5(条件明确,范围可控)UPDATEbooksSETprice=price+5WHEREnote='novel';SELECT COUNT(*) FROM books WHERE note = 'novel'确认影响行数,评估是否会对数据库性能造成压力(如更新100万条记录可能导致锁表,需在低峰期执行)。-- 错误:未加WHERE,更新全表的department_id为110(生产环境绝对禁止)UPDATEcopy_empSETdepartment_id=110;department_id改为不存在的部门ID)。UPDATEemployeesSETdepartment_id=55WHEREdepartment_id=110;错误代码: 1452 Cannot add or update a child row: a foreign key constraint fails (myemployees.employees, CONSTRAINT dept_id_fk FOREIGN KEY (department_id) REFERENCES departments(department_id))删除数据是移除表中无用记录,适用于清理过期数据(如3年前的日志)、删除无效记录(如库存为0的下架商品)、用户主动删除(如删除账号)等场景。DELETE仅删除记录,保留表结构和索引,与DROP TABLE(删除表)、TRUNCATE(清空表,不触发事务)完全不同。
DELETEFROMtable_name[WHEREcondition];WHERE子句不可省略(除非明确要清空全表,且需审批);-- 删除departments表中部门名称为'Finance'的记录(通过唯一名称定位)DELETEFROMdepartmentsWHEREdepartment_name='Finance';department_name非唯一,先查询确认记录数,再执行删除。-- 删除books表中库存为0的所有记录(批量清理无效商品)DELETEFROMbooksWHEREnum=0;DELETE FROM 表名 WHERE 条件会导致长时间锁表,影响业务。建议分批次删除:-- 每次删除1000条,循环执行直到无数据DELETEFROMbooksWHEREnum=0LIMIT1000;-- 错误:未加WHERE,删除copy_emp表中所有记录(数据不可恢复,除非有备份)DELETEFROMcopy_emp;-- 员工表中存在department_id=60的员工,删除失败DELETEFROMdepartmentsWHEREdepartment_id=60;错误代码: 1451 Cannot delete or update a parent row: a foreign key constraint fails (myemployees.employees, CONSTRAINT dept_id_fk FOREIGN KEY (department_id) REFERENCES departments(department_id))ON DELETE CASCADE(级联删除),删除部门时自动删除关联员工(需谨慎使用,避免误删关联数据)。计算列是MySQL8.0的重要特性,值由其他字段通过表达式计算得出,无需手动插入/更新,核心价值是“保证数据一致性”——避免人工计算错误(如总价=单价×数量,手动输入可能出错),适用于订单总价、年龄(通过生日计算)、积分(消费金额×10)等场景。
-- 创建表时定义计算列CREATETABLE表名(字段1类型,字段2类型,计算列名 类型 GENERATED ALWAYSAS(计算表达式)VIRTUAL);-- 修改表时添加计算列ALTERTABLE表名ADDCOLUMN计算列名 类型 GENERATED ALWAYSAS(计算表达式)VIRTUAL;GENERATED ALWAYS AS:强制计算列的值由表达式生成,不可手动修改;VIRTUAL:计算列不实际存储在表中(仅查询时计算,节省空间),MySQL8.0也支持STORED(存储计算结果,查询更快但占用空间),需根据业务选择。-- 创建订单表,total_price为计算列(单价×数量)CREATETABLEorders(order_idINTPRIMARYKEYAUTO_INCREMENT,product_idINT,priceDECIMAL(10,2),-- 单价quantityINT,-- 数量total_priceDECIMAL(10,2)GENERATED ALWAYSAS(price*quantity)VIRTUAL);-- 仅插入product_id、price、quantity,total_price自动计算INSERTINTOorders(product_id,price,quantity)VALUES(1,99.9,2);SELECT*FROMorders;-- 更新数量为3,total_price自动重新计算为99.9×3=299.7UPDATEordersSETquantity=3WHEREorder_id=1;基于test01_library数据库的books表,完成“创建数据库→建表→增删改查→统计分析”全流程,模拟真实开发中的数据处理场景。
-- 1. 创建数据库(指定字符集utf8,避免中文乱码)CREATEDATABASEIFNOTEXISTStest01_libraryCHARACTERSET'utf8';-- 2. 使用数据库USEtest01_library;-- 3. 创建books表(字段类型优化:price用DECIMAL而非FLOAT,避免精度丢失)CREATETABLEbooks(idINTPRIMARYKEY,-- 书编号为主键,唯一标识nameVARCHAR(50)NOTNULL,-- 书名非空`authors`VARCHAR(100),-- authors为关键字,用反引号包裹priceDECIMAL(10,2),-- 价格用DECIMAL,保留2位小数pubdateYEAR,-- 出版年份noteVARCHAR(100),-- 图书类型numINTDEFAULT0-- 库存默认值0);DECIMAL(10,2)而非FLOAT,FLOAT会存在精度丢失(如0.1+0.2≠0.3),而DECIMAL适合存储货币类数据。-- 1. 全字段插入(仅用于第一条初始化数据)INSERTINTObooksVALUES(1,'Tal of AAA','Dickes',23.00,1995,'novel',11);-- 2. 指定字段插入(推荐方式,兼容表结构变更)INSERTINTObooks(id,name,`authors`,price,pubdate,note,num)VALUES(2,'EmmaT','Jane lura',35.00,1993,'joke',22);-- 3. 多条插入(批量导入剩余数据,效率高)INSERTINTObooks(id,name,`authors`,price,pubdate,note,num)VALUES(3,'Story of Jane','Jane Tim',40.00,2001,'novel',0),(4,'Lovey Day','George Byron',20.00,2005,'novel',30),(5,'Old land','Honore Blade',30.00,2010,'law',0),(6,'The Battle','Upton Sara',30.00,1999,'medicine',40),(7,'Rose Hood','Richard haggard',28.00,2008,'cartoon',28);-- 1. 批量更新:小说类型书价格+5(业务需求:小说类图书涨价)UPDATEbooksSETprice=price+5WHEREnote='novel';-- 2. 单条更新:修改EmmaT的价格和类型(业务需求:纠正图书信息)UPDATEbooksSETprice=40.00,note='drama'WHEREname='EmmaT';-- 3. 批量删除:删除库存为0的图书(业务需求:清理无货商品)DELETEFROMbooksWHEREnum=0;-- 1. 模糊查询:书名包含'a'字母的书(用户搜索需求)SELECT*FROMbooksWHEREnameLIKE'%a%';-- 2. 聚合统计:书名含'a'的书的数量和库存总量(运营报表需求)SELECTCOUNT(*)AS书的数量,SUM(num)AS库存总量FROMbooksWHEREnameLIKE'%a%';-- 3. 排序查询:小说类型按价格降序(用户筛选需求)SELECT*FROMbooksWHEREnote='novel'ORDERBYpriceDESC;-- 4. 分页查询:每页5本,显示第2页(前端分页展示需求)SELECT*FROMbooksLIMIT5,5;-- 偏移量=(页码-1)×每页条数-- 5. 条件聚合:按类型统计库存,仅显示库存超30的(运营决策需求)SELECTnoteAS类型,SUM(num)AS库存总量FROMbooksGROUPBYnoteHAVINGSUM(num)>30;-- 6. 枚举转换:将note值转换为中文类型(前端展示需求)SELECTnameAS书名,CASEnoteWHEN'novel'THEN'小说'WHEN'law'THEN'法律'WHEN'medicine'THEN'医药'ELSE'其他'ENDAS中文类型FROMbooks;name字段建全文索引,提升模糊查询效率)、分页优化(如用WHERE id > 10 LIMIT 5替代LIMIT 10,5,避免全表扫描),这些都是基于基础增删改之上的进阶技能。| 操作 | 核心语法 | 核心风险点 | 安全操作建议 |
|---|---|---|---|
| 插入 | INSERT INTO 表名(列) VALUES(值) / SELECT | 主键重复、数据类型不匹配 | 指定字段插入,批量插入分批次 |
| 更新 | UPDATE 表名 SET 列=值 WHERE 条件 | 无WHERE子句、条件不明确导致误改 | 条件含主键/唯一索引,先查询后更新 |
| 删除 | DELETE FROM 表名 WHERE 条件 | 无WHERE子句、删除关联数据导致约束报错 | 分批次删除,开启事务回滚,备份关键数据 |
| 计算列 | GENERATED ALWAYS AS (表达式) VIRTUAL | 表达式错误导致计算结果异常 | 表达式需简单明确,避免复杂函数 |
掌握基础增删改后,可进一步学习: