文章目录
一、 插入数据
在数据库中添加数据,就像往一个空架子上摆放书本。用MySQL的INSERT INTO
语法,我们可以轻松“搬运”数据到表中,无论是单条添加、批量插入,还是插入默认值,灵活性都非常高。
1. 单条数据插入
首先,最常见的操作就是往表中“摆放”一条完整的数据。假设我们有一张students
表,里面有学生的基本信息,包括student_id
、name
、age
和enrollment_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, '周八');
如果表中age
和enrollment_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分支合并的时候出了问题,导致生产代码出现了异常,前面逻辑出现了混乱,本来都是小问题,而且在测试生成的时候也没发现问题,但坏就坏在这段逻辑让数据库里面运行了这样一条语句:
UPDATE 表1 set 某几个钱 = 0
where id in
(select t1_id from 表2 where 1=1)
-- 出现了类似1=1的情况,好像是因为前面某个数据没传过来
如果是正常的全表更新,就比如上面的4,我们加了 BlockAttackInnerInterceptor
( 阻止全表更新删除的一个插件) 其实是没啥问题的,但是这句sql其实是按照主键更新,这个拦截完全没用上,一下子就把表1里面所有的这几个字段全清成0了。
屋漏偏逢连夜雨,当时那段时间服务器还出了问题,备份数据库是好久之前的,直接天上飞来一连串紧急问题,我们项目里面十来个人啥也不干了,直接通宵查日志一条条手动给用户恢复数据,ε=(´ο`*)))唉。
小建议:为了保险起见,平时可以在UPDATE
前先写一个SELECT
语句检查条件是否正确,再进行更新,当然还一定要注意代码逻辑,别出我们这种错误。
5. 一个实际例子:换专业的情况
假设学校有个students
表记录学生的专业(major
字段),现在所有“计算机科学”专业的学生需要改成“人工智能”。可以使用条件更新快速实现这个调整:
-- 把所有“计算机科学”专业的学生的专业改成“人工智能”
UPDATE students
SET major = '人工智能'
WHERE major = '计算机科学';
这个操作会检查major
字段里等于“计算机科学”的所有行,并将它们更新为“人工智能”。这种批量更新方式非常适合批量数据调整,比如调整专业、更新课程等。
6. 总结
- 基本更新:用
UPDATE
加SET
修改字段,配合WHERE
确定条件。 - 多字段更新:可以一次更改多个字段,
SET
后用逗号分隔。 - 条件更新:用
WHERE
指定条件,确保只更新符合要求的数据。 - 批量更新:在条件内符合的数据会被一起更新。
- 小心无条件更新:确保
WHERE
条件不为空,否则可能影响所有数据!
三、删除数据
在数据库管理中,删除数据就像清理杂物,但具体操作可以有轻有重。MySQL里常用的删除操作有两种:DELETE
和TRUNCATE
。这两个指令看似都在“清理”数据,实际上却有很大的区别。
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. DELETE
和TRUNCATE
的区别总结
操作 | 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