摘要:到目前为止,我们已经学会了如何创造数据 (INSERT) 和查询数据 (SELECT)。但是,世界是不断变化的,我们的数据也一样。
到目前为止,我们已经学会了如何创造数据 (INSERT) 和查询数据 (SELECT)。但是,世界是不断变化的,我们的数据也一样。
朋友可能会改名字,我们和朋友认识的年份会逐年增加,甚至… 有些朋友可能会从我们的生活中“消失”。
这一章,我们就来学习两个具有“修改”和“破坏”能力的操作:
UPDATE: 更新表中的现有记录。DELETE: 删除表中的记录。郑重警告 ⚠️:这两个命令,尤其是 DELETE,是危险操作。一个不小心,就可能导致数据永久丢失。在执行它们之前,请务必三思,尤其要检查你的 WHERE 条件是否正确!
UPDATE 命令用于修改表中的数据。
基本语法:
UPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition;UPDATE table_name: 指定要更新哪张表。SET column1 = value1, ...: 指定要修改哪些列,以及它们的新值。WHERE condition: 极其重要! 指定要更新哪些行。如果 UPDATE 语句中没有 WHERE 子句,它将会更新表中的【所有行】!
想象一下,如果你执行了 UPDATE friends SET name = '路人甲';,那么你所有的朋友都会被改名为“路人甲”,那将是一场灾难!
黄金法则:在执行 UPDATE 之前,先用 SELECT 语句和相同的 WHERE 条件测试一下,看看你将要影响的是不是你真正想要修改的那些行。
示例 1:给特定朋友改名
假设“小李”决定改名叫“李雷”。
第一步:用 SELECT 确认目标
SELECT * FROM friends WHERE name = '小李';确认查询结果只有“小李”这一行,好,WHERE 条件没问题。
第二步:执行 UPDATE
UPDATE friendsSET name = '李雷'WHERE name = '小李';执行后,会返回 UPDATE 1,表示有 1 行被更新了。
验证一下:SELECT * FROM friends WHERE id = 2;,你会发现名字已经变了。
示例 2:更新多个列
假设我们发现“张三”的生日和认识年数都记错了。
这里我们用 id 来定位,因为 id 通常是独一无二的,比名字更可靠。
示例 3:基于旧值进行计算
新年到了,我们和所有朋友认识的年份都增加了一年。
注意,这个语句没有 WHERE 条件!这是少数我们希望更新全表的场景之一。它会把每一个朋友的 years_known 值都加 1。
DELETE 命令用于从表中删除一行或多行数据。
基本语法:
DELETE FROM table_nameWHERE condition;如果 DELETE 语句中没有 WHERE 子句,它将会删除表中的【所有数据】!
这通常比 UPDATE 全表更具毁灭性。执行 DELETE FROM friends; 之后,你的朋友列表就彻底空了!
白金法则:在执行 DELETE 之前,必须用 SELECT * 和相同的 WHERE 条件来预览你将要删除的数据,确保万无一失!
示例 4:删除一个朋友
假设我们和“赵四”不再是朋友了(只是假设)。
确认返回的是“赵四”那一行。
第二步:执行 DELETE
DELETE FROM friendsWHERE id = 4;执行后,会返回 DELETE 1。现在,“赵四”就从我们的表中消失了。
如果你确实是想删除一张表里的所有数据,而不是一部分,使用 DELETE FROM table_name; 当然可以,但有另一个更好、更快的命令:TRUNCATE。
特性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 (限制),让你的查询结果更加井然有序!准备好给你的数据排排坐了吗?我们下一章见!
来源:linux运维菜