【MySQL基础】数据的增删改查(CRUD)

在这里插入图片描述

文章目录

一、 插入数据

在数据库中添加数据,就像往一个空架子上摆放书本。用MySQL的INSERT INTO语法,我们可以轻松“搬运”数据到表中,无论是单条添加、批量插入,还是插入默认值,灵活性都非常高。


1. 单条数据插入

首先,最常见的操作就是往表中“摆放”一条完整的数据。假设我们有一张students表,里面有学生的基本信息,包括student_idnameageenrollment_date

INSERT INTO students (student_id, name, age, enrollment_date) 
VALUES (1, '张三', 20, '2024-10-26');
  • INSERT INTO students:指定要插入数据的表。
  • 列出字段(student_id, name, age, enrollment_date)表示我们要填充的列。
  • VALUES:用VALUES定义插入的具体值。
  • 插入的结果就是一条完整的学生记录被添加到表中。

这样,表中就多了一条学生信息,这种方法适合一次插入单条数据。


2. 批量插入数据

假设我们有多个学生数据需要一次性插入。这时就可以用批量插入的方式,把几条记录一起加进去。

INSERT INTO students (student_id, name, age, enrollment_date) 
VALUES 
(2, '李四', 21, '2024-10-27'),
(3, '王五', 22, '2024-10-28'),
(4, '赵六', 19, '2024-10-29');

批量插入时,使用一条INSERT INTO语句后列出多组VALUES值,每组用逗号分隔。这样写一次SQL就能添加多条数据,不仅节省代码量,也减少了与数据库的交互次数,非常高效!


3. 插入默认值

有时候表中的某些字段设定了默认值,例如enrollment_date默认是当天的日期,我们插入数据时就可以省略这个字段,让数据库自动填写默认值。

-- 如果我们只知道学生ID和姓名,其他的用默认值
INSERT INTO students (student_id, name) 
VALUES (5, '小七');

假如enrollment_date默认是当前日期,插入后这个字段会自动填上今天的日期,而不需要我们手动写入。利用默认值不仅方便,还能减少人为错误。


4. 部分字段插入

有时候我们并不需要为所有字段都填值,比如表中有些字段可以为空,或者我们只关心少量信息。那我们就只写这些字段即可。

-- 只插入学生ID和姓名,其他字段自动填充默认值或空值
INSERT INTO students (student_id, name) 
VALUES (6, '周八');

如果表中ageenrollment_date允许为空(或有默认值),它们会自动填充为默认值或空值。这种方法可以用来快速插入部分数据而不影响其他字段。


5. 总结

  • 单条插入:一次插入一条完整数据。
  • 批量插入:一次插入多条数据,简化代码,提高效率。
  • 插入默认值:表中设置了默认值的字段可以省略,数据库会自动填上默认内容。
  • 部分字段插入:只指定必要字段,其余字段按默认值或空值处理。

不论是单条还是批量、默认值还是部分字段,INSERT INTO都能满足各种需求,让我们可以灵活高效地把数据“搬”进数据库!

二、更新数据

在数据库中更新数据,就像给一批旧数据换上新的“衣服”,让它们符合新的需求。在MySQL里,UPDATE语法是专门为此设计的,不论是更新某一行数据,还是批量修改符合条件的数据,UPDATE都能轻松搞定。下面用大白话带你逐步了解数据更新的操作!


1. 基本的UPDATE语法

最简单的UPDATE语法是指定要更新的表名、要更改的字段和新的值。假设我们有一个students表,现在要更新学生“张三”的年龄。

-- 将学生ID为1的张三年龄改为21
UPDATE students 
SET age = 21 
WHERE student_id = 1;
  • UPDATE students:选择要操作的表。
  • SET:指定要更改的字段和新值,比如把age改成21
  • WHERE student_id = 1:加入条件,表示只更新student_id为1的行,避免误改其他数据。

注意:一定要加上WHERE条件,否则没有条件限制的UPDATE会将表中所有学生的年龄都改成21!这一点非常重要。


2. 带多个字段的更新

假设张三不仅年龄需要更新,还要改他的姓名和入学日期。我们可以用SET指定多个字段,同时修改多列。

-- 更新张三的姓名、年龄和入学日期
UPDATE students 
SET 
    name = '张三新',
    age = 22,
    enrollment_date = '2024-11-01'
WHERE student_id = 1;

SET后用逗号分隔多个字段,即可一次更新多个内容。这个方法适合需要对多列同时做修改的情况。


3. 批量条件更新

假如现在学校决定让所有年龄小于20岁的学生统一加1岁。使用条件批量更新,可以让MySQL自动找到符合条件的行并执行修改。

-- 给所有年龄小于20岁的学生加1岁
UPDATE students 
SET age = age + 1
WHERE age < 20;

这里的age = age + 1表示在现有年龄基础上加1,WHERE age < 20会筛选出年龄小于20的所有学生。结果是,符合条件的每位学生的年龄都会自动加1岁,而其他学生数据不会受影响。


4. 小心条件为空的更新

如果你在执行UPDATE时忘了加上WHERE条件,那么所有行都会被更新!为了避免这种失误,建议在使用UPDATE时仔细检查WHERE条件,确保只更新符合要求的行。

-- 不小心漏掉WHERE的情况
UPDATE students 
SET age = 18;  -- 这会把表中所有学生的年龄都改成18!
教训

之前我做项目的时候就遇上过类似的情况,我们当时出现了类似的情况,好像是test分支向master分支合并的时候出了问题,导致生产代码出现了异常,前面逻辑出现了混乱,本来都是小问题,而且在测试生成的时候也没发现问题,但坏就坏在这段逻辑让数据库里面运行了这样一条语句:

UPDATE1 set 某几个钱 = 0
	where id in
		(select t1_id from2 where 1=1)
		-- 出现了类似1=1的情况,好像是因为前面某个数据没传过来

如果是正常的全表更新,就比如上面的4,我们加了 BlockAttackInnerInterceptor( 阻止全表更新删除的一个插件) 其实是没啥问题的,但是这句sql其实是按照主键更新,这个拦截完全没用上,一下子就把表1里面所有的这几个字段全清成0了。

屋漏偏逢连夜雨,当时那段时间服务器还出了问题,备份数据库是好久之前的,直接天上飞来一连串紧急问题,我们项目里面十来个人啥也不干了,直接通宵查日志一条条手动给用户恢复数据,ε=(´ο`*)))唉。

小建议:为了保险起见,平时可以在UPDATE前先写一个SELECT语句检查条件是否正确,再进行更新,当然还一定要注意代码逻辑,别出我们这种错误。


5. 一个实际例子:换专业的情况

假设学校有个students表记录学生的专业(major字段),现在所有“计算机科学”专业的学生需要改成“人工智能”。可以使用条件更新快速实现这个调整:

-- 把所有“计算机科学”专业的学生的专业改成“人工智能”
UPDATE students 
SET major = '人工智能'
WHERE major = '计算机科学';

这个操作会检查major字段里等于“计算机科学”的所有行,并将它们更新为“人工智能”。这种批量更新方式非常适合批量数据调整,比如调整专业、更新课程等。


6. 总结

  • 基本更新:用UPDATESET修改字段,配合WHERE确定条件。
  • 多字段更新:可以一次更改多个字段,SET后用逗号分隔。
  • 条件更新:用WHERE指定条件,确保只更新符合要求的数据。
  • 批量更新:在条件内符合的数据会被一起更新。
  • 小心无条件更新:确保WHERE条件不为空,否则可能影响所有数据!

三、删除数据

在数据库管理中,删除数据就像清理杂物,但具体操作可以有轻有重。MySQL里常用的删除操作有两种:DELETETRUNCATE。这两个指令看似都在“清理”数据,实际上却有很大的区别。


1. 删除特定数据:DELETE

DELETE语法可以让我们有选择性地删除数据,适合清理特定的记录。比如我们有一个students表,记录了所有学生的信息,某位学生毕业了,这时就可以用DELETE删除该学生的信息。

-- 删除学生ID为1的记录
DELETE FROM students 
WHERE student_id = 1;
  • DELETE FROM students:表示要从students表中删除数据。
  • WHERE student_id = 1:加上条件,确保只删除ID为1的学生。

这样,只有符合WHERE条件的行会被删除,其他数据不受影响。如果漏掉WHERE条件怎么办呢?请看下一条。


2. 无条件删除:小心用DELETE

在使用DELETE时,如果不加WHERE条件,就会删除整个表中的所有数据!这种情况比较危险,尤其在生产环境里操作时一定要慎重。

-- 没有WHERE条件,将删除students表的所有数据
DELETE FROM students;

这个操作会清空students表里的所有内容,但表结构(字段和表的定义)仍然保留。使用无条件的DELETE时要特别小心,以免误删数据。


3. 快速清空表:TRUNCATE

TRUNCATE是另一个“清空”表数据的命令,执行速度比DELETE更快。它专门用于快速清空表中的所有数据,而且无法通过WHERE条件筛选。TRUNCATE通常会重新分配表的存储空间,因此速度非常快,但是操作后无法恢复

-- 使用TRUNCATE清空students表的数据
TRUNCATE TABLE students;

DELETE不同的是,TRUNCATE相当于把整个表“重置”了。这意味着数据一旦清空,整个表将完全恢复到“刚创建”的状态,比如所有自增ID会重新从1开始计数。


4. DELETETRUNCATE的区别总结

操作 DELETE TRUNCATE
是否可选行 可以用WHERE选择特定行 无法选择,直接清空整表
操作速度 慢(逐行删除) 快(直接清空并重置表)
自增ID重置 不重置,自增继续 重置,自增从1开始
适用场景 删除特定数据或小批量数据 清空整个表数据,快速释放空间
是否可恢复 可以通过事务回滚 一般无法恢复,危险操作

5. 实例场景解析

  • 毕业生数据清理:如果学校数据库只需删除个别学生的数据,可以用DELETE加上WHERE条件,比如删除ID为1的学生。

    DELETE FROM students WHERE student_id = 1;
    
  • 每学期新表初始化:学校需要每学期清空一次学生成绩数据(但保留表结构),可以用TRUNCATE快速完成:

    TRUNCATE TABLE grades;
    

这样既能保证数据全部清空,且表结构(列、类型等)依然保留,也不会影响到其他表关联关系。


6. 小心操作:删除数据前的思考

  • 避免误删:在删除操作之前,建议先用SELECT查询确认要删除的内容。
  • 考虑是否备份:数据删除后一般无法恢复,重要数据可以先备份。
  • 小批量数据推荐用DELETE,批量或全部清空用TRUNCATE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值