这些是DML(数据操纵语言)命令,用来改变数据:INSERT 添加行,UPDATE 修改现有行, 删除行。与 (仅读取)不同,这些操作会修改数据库——因此需要谨慎,特别是 子句。
这些是DML(数据操纵语言)命令,用来改变数据:INSERT 添加行,UPDATE 修改现有行, 删除行。与 (仅读取)不同,这些操作会修改数据库——因此需要谨慎,特别是 子句。
DELETESELECTWHERE-- insert one row
INSERT INTO users (name, email, age)
VALUES ('Ann', '[email protected]', 30);
-- insert multiple rows at once (efficient)
INSERT INTO users (name, email)
VALUES ('Bob', '[email protected]'), ('Carol', '[email protected]');
-- insert from a query
INSERT INTO archived_users SELECT * FROM users WHERE inactive = true;
你指定列和值。在一条语句中插入多行比许多单独的插入更高效。
UPDATE users
SET age = 31, updated_at = NOW() -- set one or more columns
WHERE id = 5; -- ❗ WHICH rows to update
-- ❌ DANGER — no WHERE clause updates EVERY row in the table!
UPDATE users SET active = false; -- sets ALL users inactive 😱
关键: 没有 WHERE 子句的 UPDATE(或 DELETE)会影响表中的每一行。 遗漏 WHERE 是一个灾难性的常见错误——必须始终检查两遍。
DELETE FROM users WHERE id = 5; -- delete a specific row
DELETE FROM users WHERE inactive = true; -- delete matching rows
-- ❌ DANGER — no WHERE deletes the ENTIRE table's contents!
DELETE FROM users;
✓ ALWAYS include a WHERE clause (unless you truly mean to affect all rows)
✓ Test the WHERE first with SELECT (SELECT * WHERE ... → see what you'd affect)
✓ Use TRANSACTIONS (BEGIN ... COMMIT/ROLLBACK) so you can undo mistakes
✓ DELETE vs TRUNCATE: TRUNCATE quickly empties a whole table (faster, but not row-by-row,
can't be rolled back in some DBs, resets auto-increment)
INSERT、UPDATE 和 DELETE 是应用程序改变数据的方式——对于任何存储和修改信息的应用程序来说都是基础(创建记录、编辑、删除),所以理解它们是必不可少的日常知识,与 SELECT 并列。
了解如何插入(单行、多行或从查询)、更新(设置列)和删除行对所有数据修改操作都是必要的。
最关键的一点是缺少 WHERE 子句的危险:没有 WHERE 的 UPDATE 或 DELETE 会影响表中的每一行——这是一个灾难性且惊人普遍的错误,可能会导致所有数据被擦除或破坏。
理解这种危险和安全实践(始终包含 WHERE、先用 SELECT 测试条件、使用事务以便错误可以回滚)是防止严重数据丢失事故的重要知识。
了解相关细节(高效的多行插入、DELETE 与 TRUNCATE 的清空表差异)完善了实际知识。
由于修改数据是应用程序的基础,而且缺少 WHERE 的错误既是灾难性的又是常见的(真实生产数据灾难的频繁原因),掌握这些 DML 命令——特别是围绕 WHERE 子句和事务安全的关键纪律——对于任何编写数据修改 SQL 的人来说都是核心的、必知的知识,其中风险(不可逆的数据丢失)使安全实践与语法一样重要。