news 2026/5/16 3:50:04

CRUD 入门:数据的增、查、改、删

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CRUD 入门:数据的增、查、改、删

在前一篇中,我们成功创建了数据库和表,并初步了解了数据类型。接下来,我们将进入数据库操作中最核心、最常用的部分——CRUD。CRUD 是四个基本操作的缩写:Create(增加)、Read(查询)、Update(更新)、Delete(删除)。这四项操作几乎是所有数据库应用的基础,熟练掌握它们,就掌握了与数据库交互的“对话能力”。

本文将以之前创建的users表为载体,带你系统学习:

  • 使用INSERT插入单行、多行数据
  • 使用SELECT查询数据(全列、指定列、表达式、别名、去重)
  • 使用UPDATE修改数据
  • 使用DELETE删除数据
  • 实战:完成用户表的增删改查

1. 插入数据:INSERT INTO

1.1 基本语法

INSERTINTO表名[(1,2,...)]VALUES(1,2,...),(3,4,...),...;
  • 列名列表是可选的,如果省略,则需要按表定义顺序为所有列提供值(自动增长的列可以指定NULLDEFAULT)。
  • 可以一次性插入多行数据,以提高效率。

1.2 插入单行

我们以上一篇创建的users表为例,插入一条完整的记录:

INSERTINTOusers(username,email,password,birthdate,status)VALUES('alice','alice@example.com','hashed_pw_alice','1995-06-15',1);

因为id列是AUTO_INCREMENT,我们无需手动指定,MySQL 会自动生成。mobileavatar_urlsignaturelast_login_at等列有默认值或允许 NULL,未指定则会自动使用默认值(NULL 或指定默认值)。

验证插入结果:

SELECT*FROMusers;

1.3 插入多行

可以一次性插入多条记录,用逗号分隔:

INSERTINTOusers(username,email,password,birthdate,status)VALUES('bob','bob@example.com','hashed_pw_bob','1990-01-20',1),('carol','carol@example.com','hashed_pw_carol','2000-08-03',1),('dave','dave@example.com','hashed_pw_dave','1985-12-12',1);

1.4 插入指定列

如果你的 INSERT 语句只包含了部分列,那么其他未指定的列将使用默认值或 NULL(取决于定义)。例如,只插入必填字段:

INSERTINTOusers(username,email,password)VALUES('eve','eve@example.com','hashed_pw_eve');

此时,birthdate会为 NULL,status会使用默认值 1。


2. 查询数据:SELECT

SELECT是 SQL 中使用最频繁的语句,用于从表中检索数据。

2.1 基本查询

查询所有列

SELECT*FROMusers;

使用*很方便,但在生产环境中通常不推荐,因为它可能带来不必要的 I/O 开销,且无法利用覆盖索引优化。明确列出所需列是更好的习惯。

查询指定列

SELECTusername,emailFROMusers;

2.2 表达式与别名

你可以在 SELECT 列表中使用表达式。例如,如果我们想展示一个由usernameemail组合而成的“显示名”:

SELECTusername,CONCAT(username,' <',email,'>')ASdisplay_nameFROMusers;
  • AS用于给列或表达式取别名,方便阅读。别名也可以用在后续的ORDER BYGROUP BY中(但需注意标准 SQL 的执行顺序)。
  • 如果别名包含空格或特殊字符,需要用反引号或双引号包裹,如AS 'display name'

算术运算示例:假设有一张商品表,可以使用price * quantity计算总价。

2.3 去重:DISTINCT

如果想查看用户表中有哪些不同的出生年份(假设我们存储的是 DATE 类型),可以使用DISTINCT

SELECTDISTINCTYEAR(birthdate)ASbirth_yearFROMusersWHEREbirthdateISNOTNULL;

DISTINCT作用在整个选择列表上,即去掉所有选择列都相同的行。

2.4 查询常量与函数

SELECT 也可以查询不来自表的数据,如系统信息:

SELECTVERSION(),NOW(),'Hello'ASgreeting;

这在调试或写存储过程时很有用。


3. 修改数据:UPDATE

UPDATE语句用于修改表中已存在的行。

3.1 基本语法

UPDATE表名SET1=新值1,2=新值2,...[WHERE条件];

⚠️ 强烈建议先写 WHERE 条件再执行,避免误更新整个表!

3.2 示例:更新用户状态和签名

将用户alice的状态改为“冻结”(0),并添加个性签名:

UPDATEusersSETstatus=0,signature='暂时离开,勿念'WHEREusername='alice';

验证更新:

SELECTusername,status,signatureFROMusersWHEREusername='alice';

如果忘记添加 WHERE 条件,所有行的status都会被更新,后果将非常严重。

3.3 使用表达式更新

可以在 SET 中使用当前列的值。比如把所有用户的激活状态反转(0 变 1,1 变 0)—— 虽然这不是常规操作,但演示一下:

UPDATEusersSETstatus=1-status;

这会把status = 0的变为 1,status = 1的变为 0。执行前务必确认 WHERE 条件是否必要。


4. 删除数据:DELETE

4.1 基本语法

DELETEFROM表名[WHERE条件];

同样需要万分小心,没有 WHERE 条件的 DELETE 会清空整个表!如果只是想要清空表,更高效的方式是使用TRUNCATE TABLE 表名,它会重置自增计数器且不记录逐行删除日志。

4.2 删除指定行

删除用户bob

DELETEFROMusersWHEREusername='bob';

如果存在多条username = 'bob',则会全部删除。建议 DELETE 时使用唯一键(如主键)来精确定位。

4.3 删除所有行(慎用)

DELETEFROMusers;

DROP TABLE users;不同,DELETE仅删除数据,保留表结构和索引等。如果要清空表且希望重置自增值,可以使用:

TRUNCATETABLEusers;

TRUNCATE是一个 DDL 操作,无法回滚,速度极快。


5. 实战:完成用户表的增删改查

让我们把前面的知识串起来,模拟一个简单的用户管理场景。假设我们有一个初始为空的users表(可重新创建或清空数据后操作)。

5.1 插入用户

INSERTINTOusers(username,email,password,birthdate)VALUES('zhangsan','zhangsan@example.com','pass_zhangsan','1998-07-10'),('lisi','lisi@example.com','pass_lisi','2002-11-25'),('wangwu','wangwu@example.com','pass_wangwu','1995-03-08'),('zhaoliu','zhaoliu@example.com','pass_zhaoliu','1990-09-17');

5.2 查询所有已激活用户

SELECTid,username,email,birthdateFROMusersWHEREstatus=1;

5.3 更新用户邮箱

lisi更换了邮箱:

UPDATEusersSETemail='lisi_new@example.com'WHEREusername='lisi';

5.4 删除某个用户

zhaoliu注销账号:

DELETEFROMusersWHEREusername='zhaoliu';

5.5 验证最终结果

SELECT*FROMusers;

你应该能看到zhangsanlisiwangwu三个人,其中lisi的邮箱已更新,zhaoliu已消失。

扩展练习

  1. 尝试批量插入 10 条用户记录,其中有几个用户的状态设为 0。
  2. 编写一个 UPDATE 语句,将所有 2000 年后出生的用户签名统一设置为“千禧一代”。
    (提示:WHERE birthdate > ‘2000-01-01’)
  3. 删除所有状态为 0 的用户(使用 DELETE)。

6. 小结

本文我们学习了 MySQL 中最基础的 CRUD 操作:

  • INSERT插入数据,支持单行、多行及指定列;
  • SELECT查询数据,包括指定列、表达式、别名和DISTINCT
  • UPDATE修改数据,必须谨慎加 WHERE 条件;
  • DELETE删除数据,同样需确认条件,清空表时可考虑 TRUNCATE。

这些操作是后续所有复杂查询和数据处理的基础。下一篇我们将深入 SELECT 的过滤与排序,让数据查询更加精准和高效。

思考题

  1. 如果用INSERT INTO users VALUES (NULL, ...)插入,会发生什么?(提示:自增列可以显式给 NULL 吗?)
  2. DELETETRUNCATE的区别是什么?在事务中使用它们,回滚后效果有何不同?
  3. 假设我们误执行了无 WHERE 的 UPDATE,有没有办法恢复?(提示:需要提前准备什么?)

参考资料

  • MySQL 8.0 Reference Manual - INSERT Statement
  • MySQL 8.0 Reference Manual - SELECT Statement
  • MySQL 8.0 Reference Manual - UPDATE Statement
  • MySQL 8.0 Reference Manual - DELETE Statement

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 3:47:04

华硕游侠2-RX键盘多功能滚轮自定义M失效的解决方案

新买了一块游侠2 rx键盘&#xff0c;想着用自定义滚轮方便打开常用程序&#xff0c;但是发现在Armoury Crate中设置后不起作用&#xff0c;网上解决方案伤筋动骨&#xff0c;得不偿失&#xff0c;有一定风险。 经测试&#xff0c;自定义滚轮能正常执行宏定义&#xff0c;只是对…

作者头像 李华
网站建设 2026/5/16 3:46:04

你以为回文对只是字符串题?其实它在考验你的“系统设计思维”

你以为回文对只是字符串题?其实它在考验你的“系统设计思维” 很多人第一次看到「回文对(Palindrome Pairs)」这道题时,反应都差不多: “哦,不就是字符串拼接吗?” 然后吭哧吭哧开始双重循环。 结果: O(n * k)数据一大。 直接超时。 更扎心的是: 你会发现自己…

作者头像 李华
网站建设 2026/5/16 3:43:23

基于FFmpeg的视频帧批量提取工具ClipGen:从原理到实战

1. 项目概述与核心价值最近在折腾一些内容创作和素材管理的工作流&#xff0c;发现一个挺普遍但处理起来又很繁琐的问题&#xff1a;如何快速、批量地从视频里提取出高质量的静态帧&#xff0c;也就是我们常说的“截图”。无论是做视频封面、内容预览图&#xff0c;还是为AI训练…

作者头像 李华
网站建设 2026/5/16 3:43:22

AI编程助手规则配置指南:提升Cursor代码生成质量与规范一致性

1. 项目概述&#xff1a;当你的代码编辑器开始“思考”如果你是一名开发者&#xff0c;最近可能被一个词刷屏了&#xff1a;Cursor。这款基于AI的代码编辑器&#xff0c;以其深度集成的代码生成、理解和修改能力&#xff0c;正在悄然改变很多人的编程习惯。但今天我们不聊Curso…

作者头像 李华
网站建设 2026/5/16 3:43:11

AFDM-ISAC系统:通信与感知融合的6G关键技术

1. AFDM-ISAC系统概述&#xff1a;通信与感知的融合创新在6G及未来无线通信的发展蓝图中&#xff0c;集成感知与通信&#xff08;ISAC&#xff09;技术正成为关键突破口。传统无线系统通常将通信与感知功能分离设计&#xff0c;导致频谱资源浪费和硬件成本增加。ISAC的核心思想…

作者头像 李华