MySQL 实战入门从"增删改查"到"高效查询"的操作

 更新时间:2026年02月28日 16:09:54   作者:鱼人  
本文介绍了MySQL的核心CRUD操作,包括增删改查的详细语法和最佳实践,还涵盖了多表连接、分组过滤、子查询、事务控制和索引管理等高级功能,感兴趣的朋友跟随小编一起看看吧

在数据驱动的时代,MySQL 作为全球最流行的开源关系型数据库,是每一位后端开发者、数据分析师乃至全栈工程师的必修课。无论你的架构多么宏大,微服务多么复杂,最终数据的落地往往都回归到最基础的 CRUD(Create, Read, Update, Delete)操作。

很多初学者只会写 SELECT *,却在面对百万级数据时束手无策;或者在更新数据时因忘记加 WHERE 条件而酿成“删库跑路”的惨剧。本文将带你系统梳理 MySQL 的核心操作,不仅教你“怎么写”,更教你“怎么写得安全、高效”。

一、基石:数据的“增删改查” (CRUD)

1.1 增 (Create):不仅仅是插入

插入数据看似简单,但处理批量插入和默认值才是实战关键。

单条插入

INSERT INTO users (username, email, age, created_at) 
VALUES ('alice', 'alice@example.com', 25, NOW());

批量插入(性能关键) : 不要在循环中执行单条 INSERT!一次性插入多条数据能减少网络交互和事务开销,性能提升数倍。

INSERT INTO users (username, email, age, created_at) 
VALUES 
  ('bob', 'bob@example.com', 30, NOW()),
  ('charlie', 'charlie@example.com', 28, NOW()),
  ('david', 'david@example.com', 22, NOW());

忽略或更新: 如果主键冲突怎么办?

INSERT INTO visits (ip, count) VALUES ('192.168.1.1', 1)
ON DUPLICATE KEY UPDATE count = count + 1;
  • INSERT IGNORE: 冲突则直接忽略,不报错。
  • ON DUPLICATE KEY UPDATE: 冲突则执行更新操作(常用于统计计数)。

1.2 删 (Delete):高危操作,慎之又慎

铁律:执行 DELETE 前,必须先执行对应的 SELECT 确认范围!

条件删除

-- 先确认:SELECT * FROM users WHERE age < 18 AND status = 'inactive';
DELETE FROM users 
WHERE age < 18 AND status = 'inactive';

逻辑删除 vs 物理删除: 在生产环境中,严禁轻易使用物理删除DELETE)。通常会在表中增加 is_deleteddeleted_at 字段。

做法:UPDATE users SET is_deleted = 1, deleted_at = NOW() WHERE id = 100;

好处:数据可恢复,便于审计,避免外键约束报错。

清空表: 如果要清空整张表,用 TRUNCATE TABLE users;DELETE FROM users; 更快,且重置自增 ID,但它无法回滚(取决于事务隔离级别),且不会触发删除触发器。

1.3 改 (Update):精准打击

更新操作同样需要 WHERE 条件的保护。

单字段与多字段更新

UPDATE users 
SET age = 26, last_login = NOW() 
WHERE username = 'alice';

基于计算的更新

-- 所有用户积分加 10
UPDATE users SET score = score + 10;

多表关联更新(MySQL 特色):

UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.vip_level = 'gold'
WHERE o.total_amount > 10000;

1.4 查 (Select):灵魂所在

查询是数据库最高频的操作,也是优化空间最大的部分。

基础查询

SELECT id, username, email FROM users WHERE age > 18 ORDER BY created_at DESC LIMIT 10;

模糊查询

-- 查找名字包含 "li" 的用户
SELECT * FROM users WHERE username LIKE '%li%'; 
-- 注意:前缀通配符 '%li' 会导致索引失效,性能较差

去重与统计

SELECT DISTINCT city FROM users; -- 去重
SELECT COUNT(*), AVG(age) FROM users; -- 聚合统计

二、进阶:常用语句与核心功能

掌握了 CRUD 只是第一步,真正让 MySQL 发挥威力的是以下高级特性。

2.1 多表连接 (JOIN)

关系型数据库的核心在于“关系”。

INNER JOIN:只返回两个表中匹配的行(交集)。

SELECT u.username, o.order_no 
FROM users u 
INNER JOIN orders o ON u.id = o.user_id;

LEFT JOIN:返回左表所有行,右表没有匹配的填 NULL(常用于查“未下单的用户”)。

SELECT u.username, o.order_no 
FROM users u 
LEFT JOIN orders o ON u.id = o.user_id 
WHERE o.order_no IS NULL; -- 找出从未下过单的用户

2.2 分组与过滤 (GROUP BY & HAVING)

GROUP BY:将数据按某列分组。

HAVING:对分组后的结果进行过滤(WHERE 无法用于聚合函数)。

-- 统计每个城市的用户数,只显示超过 100 人的城市
SELECT city, COUNT(*) as user_count 
FROM users 
GROUP BY city 
HAVING user_count > 100 
ORDER BY user_count DESC;

2.3 子查询 (Subquery)

在查询中嵌套查询。虽然灵活,但性能通常不如 JOIN,需谨慎使用。

-- 查找订单金额大于平均订单金额的订单
SELECT * FROM orders 
WHERE amount > (SELECT AVG(amount) FROM orders);

2.4 事务控制 (Transaction)

涉及金钱、库存等关键业务,必须保证原子性(ACID)。

START TRANSACTION;
-- 1. 扣减库存
UPDATE products SET stock = stock - 1 WHERE id = 101;
-- 2. 创建订单
INSERT INTO orders (product_id, user_id) VALUES (101, 55);
-- 检查是否有错误,如果有则回滚,否则提交
-- ROLLBACK; 
COMMIT;

2.5 索引管理 (Index)

索引是查询速度的加速器,但会拖慢写入速度。

创建索引

CREATE INDEX idx_username ON users(username);
CREATE UNIQUE INDEX idx_email ON users(email); -- 唯一索引,防止重复

查看执行计划(优化必做): 在 SQL 前加 EXPLAIN,查看是否用到了索引 (type: refrange 为佳,ALL 为全表扫描,需优化)。

EXPLAIN SELECT * FROM users WHERE username = 'alice';

三、避坑指南与最佳实践

  • 拒绝 SELECT *
    • 原因:网络传输浪费、无法利用覆盖索引、表结构变更可能导致代码出错。
    • 做法:明确列出需要的字段 SELECT id, name, ...
  • 小心 NULL 值:
    • NULL 不等于 0 或空字符串。在计算和判断时要格外小心(如 COUNT(column) 不统计 NULL 值,而 COUNT(*) 统计)。
    • 建议在建表时尽量设置 NOT NULL 并给默认值。
  • 分页优化的陷阱:
-- 推荐:利用主键索引
SELECT * FROM users WHERE id > 100000 LIMIT 10;
  • 深分页(LIMIT 100000, 10)非常慢,因为 MySQL 要扫描前 100000 条然后丢弃。
  • 优化:使用“游标法”或“延迟关联”。
  • 字符集选择:
    • 现在统一推荐使用 utf8mb4,因为它支持 Emoji 表情等特殊字符,而旧的 utf8 在 MySQL 中实际上是 utf8mb3,不支持 Emoji。
  • SQL 注入防御:
    • 永远不要拼接用户输入到 SQL 字符串中。
    • 必须使用预编译语句(Prepared Statements),如在 Java 中使用 PreparedStatement,在 Node.js 中使用参数化查询,在 Python 中使用 %s 占位符。

四、结语

MySQL 的学习曲线是“易学难精”。写出能跑的 SELECT 语句只需五分钟,但写出在千万级数据下依然毫秒级响应、在并发高负载下依然数据一致的 SQL,则需要深厚的功底。

  • 对于初学者:熟练掌握 CRUD 和 JOIN,理解事务的基本概念。
  • 对于进阶者:深入理解索引原理(B+ 树)、执行计划分析、锁机制以及慢查询优化。

记住,数据库是应用的最后一道防线。优秀的代码不仅逻辑严密,更要对数据心存敬畏。每一次 UPDATEDELETE 前的深思熟虑,都是专业素养的体现。

到此这篇关于MySQL 实战入门:从“增删改查”到“高效查询”的核心指南的文章就介绍到这了,更多相关mysql增删改查到高效查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql默认编码为UTF-8 通过修改my.ini实现方法

    mysql默认编码为UTF-8 通过修改my.ini实现方法

    这篇文章主要介绍了mysql默认编码为UTF-8 通过修改my.ini实现方法的相关资料,为了防止出现乱码,Latin1是不支持汉字的,所以要将其改为UTF-8或GBK,需要的朋友可以参考下
    2017-01-01
  • Trae MySQL MCP 连接失败(Fail to start)的问题解决

    Trae MySQL MCP 连接失败(Fail to start)的

    本文详细介绍了使用Trae工具远程访问内网MySQL数据库时遇到的启动和认证兼容问题,并通过本地命令映射和环境变量注入的方式成功解决,具有一定的参考价值,感兴趣的可以了解一下
    2026-01-01
  • MySQL表的增删改查基础教程

    MySQL表的增删改查基础教程

    这篇文章主要给大家介绍了关于MySQL表的增删改查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • MySQL的几种分页方式,你知道几种方式

    MySQL的几种分页方式,你知道几种方式

    这篇文章主要介绍了MySQL的几种分页方式,需要的朋友可以参考下
    2023-06-06
  • 基于Mysql存储引擎的深入分析

    基于Mysql存储引擎的深入分析

    本篇文章是对Mysql存储引擎进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL报错1118,数据类型长度过长问题及解决

    MySQL报错1118,数据类型长度过长问题及解决

    在使用MySQL过程中,常见的一个问题是报错1118,这通常发生在创建表时,错误提示为“Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual
    2024-10-10
  • Mysql超时配置项的深入理解

    Mysql超时配置项的深入理解

    超时是我们日常经常会遇到的一个问题,这篇文章主要给大家介绍了关于Mysql超时配置项的深入理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,需要的朋友可以参考下
    2023-01-01
  • deepin 2014系统下安装mysql数据库的方法步骤

    deepin 2014系统下安装mysql数据库的方法步骤

    这篇文章主要给大家介绍了在deepin 2014系统下安装mysql数据库的方法步骤,文中通过图文介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • Mysql 5.6

    Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的问题

    这篇文章主要介绍了Mysql 5.6 “隐式转换”导致的索引失效和数据不准确的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • MySQL 密码设置

    MySQL 密码设置

    本文介绍了如何修改一个用户的密码,你可以使用三种方法,GRANT语句、SET PASSWORD语句、直接修改授权表以及使用管理工具mysqladmin。
    2009-04-04

最新评论