到目前为止,我们已经学会了如何创造数据 (INSERT) 和查询数据 (SELECT)。但是,世界是不断变化的,我们的数据也一样。
朋友可能会改名字,我们和朋友认识的年份会逐年增加,甚至… 有些朋友可能会从我们的生活中“消失”。
这一章,我们就来学习两个具有“修改”和“破坏”能力的操作:
- UPDATE: 更新表中的现有记录。
- DELETE: 删除表中的记录。
郑重警告 :这两个命令,尤其是 DELETE,是危险操作。一个不小心,就可能导致数据永久丢失。在执行它们之前,请务必三思,尤其要检查你的 WHERE 条件是否正确!
8.1 更新表中的记录 (UPDATE)
UPDATE 命令用于修改表中的数据。
基本语法:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
- UPDATE table_name: 指定要更新哪张表。
- SET column1 = value1, ...: 指定要修改哪些列,以及它们的新值。
- WHERE condition: 极其重要! 指定要更新哪些行。
8.2WHERE子句在UPDATE中的重要性
如果 UPDATE 语句中没有 WHERE 子句,它将会更新表中的【所有行】!
想象一下,如果你执行了 UPDATE friends SET name = '路人甲';,那么你所有的朋友都会被改名为“路人甲”,那将是一场灾难!
黄金法则:在执行 UPDATE 之前,先用 SELECT 语句和相同的 WHERE 条件测试一下,看看你将要影响的是不是你真正想要修改的那些行。
示例 1:给特定朋友改名
假设“小李”决定改名叫“李雷”。
第一步:用 SELECT 确认目标
SELECT * FROM friends WHERE name = '小李';
确认查询结果只有“小李”这一行,好,WHERE 条件没问题。
第二步:执行 UPDATE
UPDATE friends
SET name = '李雷'
WHERE name = '小李';
执行后,会返回 UPDATE 1,表示有 1 行被更新了。
验证一下:SELECT * FROM friends WHERE id = 2;,你会发现名字已经变了。
示例 2:更新多个列
假设我们发现“张三”的生日和认识年数都记错了。
UPDATE friends
SET birthday = '1989-02-01', years_known = 11
WHERE id = 3;
这里我们用 id 来定位,因为 id 通常是独一无二的,比名字更可靠。
示例 3:基于旧值进行计算
新年到了,我们和所有朋友认识的年份都增加了一年。
UPDATE friends
SET years_known = years_known + 1;
注意,这个语句没有 WHERE 条件!这是少数我们希望更新全表的场景之一。它会把每一个朋友的 years_known 值都加 1。
8.3 删除表中的记录 (DELETE)
DELETE 命令用于从表中删除一行或多行数据。
基本语法:
DELETE FROM table_name
WHERE condition;
- DELETE FROM table_name: 指定要从哪张表中删除。
- WHERE condition: 极其极其重要! 指定要删除哪些行。
8.4WHERE子句在DELETE中的重要性
如果 DELETE 语句中没有 WHERE 子句,它将会删除表中的【所有数据】!
这通常比 UPDATE 全表更具毁灭性。执行 DELETE FROM friends; 之后,你的朋友列表就彻底空了!
白金法则:在执行 DELETE 之前,必须用 SELECT * 和相同的 WHERE 条件来预览你将要删除的数据,确保万无一失!
示例 4:删除一个朋友
假设我们和“赵四”不再是朋友了(只是假设)。
第一步:用 SELECT 确认目标
SELECT * FROM friends WHERE id = 4;
确认返回的是“赵四”那一行。
第二步:执行 DELETE
DELETE FROM friends
WHERE id = 4;
执行后,会返回 DELETE 1。现在,“赵四”就从我们的表中消失了。
8.5 使用TRUNCATE清空表
如果你确实是想删除一张表里的所有数据,而不是一部分,使用 DELETE FROM table_name; 当然可以,但有另一个更好、更快的命令:TRUNCATE。
TRUNCATE TABLE friends;
TRUNCATE vs DELETE (无 WHERE)
特性 | DELETE FROM table_name; | TRUNCATE TABLE table_name; |
速度 | 慢。一行一行地删,记录日志。 | 极快。直接释放数据页,像格式化。 |
事务日志 | 每删一行都记录,日志文件会很大。 | 记录的操作很少,日志占用小。 |
触发器 | 会为每一行触发 DELETE 触发器。 | 不会触发 DELETE 触发器。 |
返回 | 返回删除了多少行 (DELETE 4)。 | 不返回计数。 |
回滚 | 可以被 ROLLBACK。 | 通常不能(或在某些数据库中行为不同)。 |
简单来说:想清空整张表,用 TRUNCATE。想删除满足条件的某些行,用 DELETE。
本章小结
你已经掌握了操作数据的最后两块拼图!现在你拥有了对数据完整的 CRUD (Create, Read, Update, Delete) 能力。
- 我们学会了用 UPDATE 来修改数据,并深刻理解了 WHERE 的重要性。
- 我们学会了用 DELETE 来删除数据,并养成了先 SELECT 再 DELETE 的好习惯。
- 我们还了解了更高效的清空工具 TRUNCATE。
到目前为止,我们查询出的数据都是“乱序”的(取决于数据库内部的存储顺序)。如果我们希望结果按照我们指定的顺序(比如按生日、按认识年份)排列呢?
下一章,我们将学习 ORDER BY (排序) 和 LIMIT (限制),让你的查询结果更加井然有序!准备好给你的数据排排坐了吗?我们下一章见!