【MySQL 笔记】基本查询(上)—— 表的增删改查(CRUD)详解
这是 MySQL 最基础、最常用的四大操作:增(Insert)、删(Delete)、改(Update)、查(Select),也叫 CRUD。
几乎所有业务代码最终都会落到这四个语句上。
一、四大操作对比速查表
| 操作 | 英文 | SQL 关键字 | 是否返回受影响行数 | 是否可回滚(事务内) | 最常用场景 | 注意事项 |
|---|---|---|---|---|---|---|
| 增 | Create | INSERT INTO | 是(ROW_COUNT()) | 是 | 新增用户、订单、日志 | 字段顺序/自增/默认值 |
| 删 | Delete | DELETE FROM | 是 | 是 | 软删除、清理过期数据 | WHERE 务必写! |
| 改 | Update | UPDATE … SET | 是 | 是 | 修改用户信息、订单状态 | WHERE + LIMIT 防误操作 |
| 查 | Read | SELECT … FROM | 是(返回结果集) | 否(读不加锁时) | 几乎所有查询 | 字段、条件、排序、分页 |
二、完整语法模板(建议收藏)
1. 增(INSERT)
-- 1. 标准单行插入(推荐写列名)
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);
-- 2. 多行插入(性能更好)
INSERT INTO users (username, password, created_at)
VALUES
('zhangsan', '123456', NOW()),
('lisi', 'abcdef', NOW()),
('wangwu', 'qwe123', NOW());
-- 3. 从另一张表插入(INSERT ... SELECT)
INSERT INTO users_archive (id, username, archived_at)
SELECT id, username, NOW()
FROM users
WHERE status = 'deleted';
-- 4. 插入或更新(MySQL 特有)
INSERT INTO users (id, username, last_login)
VALUES (1001, 'admin', NOW())
ON DUPLICATE KEY UPDATE
username = VALUES(username),
last_login = NOW();
2. 删(DELETE)
-- 危险操作!永远带 WHERE
DELETE FROM users
WHERE id = 1001;
-- 删除多条
DELETE FROM orders
WHERE status = 'cancelled'
AND created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 限制删除行数(防手滑)
DELETE FROM temp_logs
WHERE create_time < '2025-01-01'
LIMIT 1000;
-- 清空表(比 DELETE 快得多,但不能回滚)
TRUNCATE TABLE temp_table;
3. 改(UPDATE)
-- 基础更新
UPDATE users
SET nickname = '张三丰',
updated_at = NOW()
WHERE id = 1001;
-- 批量更新 + 条件表达式
UPDATE products
SET stock = stock - 1,
updated_at = NOW()
WHERE id IN (5001, 5002, 5003)
AND stock > 0;
-- 带 JOIN 的更新(非常实用)
UPDATE orders o
INNER JOIN users u ON o.user_id = u.id
SET o.status = 'completed',
o.updated_at = NOW()
WHERE u.status = 'active'
AND o.created_at >= '2026-01-01';
-- 防误操作:加 LIMIT
UPDATE users
SET is_vip = 1
WHERE register_date >= '2026-01-01'
LIMIT 100;
4. 查(SELECT)—— 基础篇
-- 1. 全表查询(开发环境可用,生产慎用)
SELECT * FROM users;
-- 2. 指定字段(推荐)
SELECT id, username, nickname, created_at
FROM users;
-- 3. 别名(AS 可省略)
SELECT username AS 用户名,
nickname AS 昵称,
created_at AS 注册时间
FROM users;
-- 4. 去重
SELECT DISTINCT city
FROM users;
-- 5. 基本条件
SELECT *
FROM orders
WHERE status = 'pending'
AND amount > 100
AND created_at >= '2026-03-01';
-- 6. 排序 + 分页(最常用组合)
SELECT id, order_no, amount, created_at
FROM orders
WHERE user_id = 1001
ORDER BY created_at DESC
LIMIT 10 OFFSET 20; -- 第3页,每页10条
三、高频组合写法(面试/实战必会)
-- 1. 新增用户并获取自增ID
INSERT INTO users (username, password) VALUES ('admin', '123456');
SELECT LAST_INSERT_ID(); -- 或在代码中用返回结果获取
-- 2. 软删除(推荐生产环境做法)
UPDATE users
SET is_deleted = 1,
deleted_at = NOW()
WHERE id = 1001;
-- 3. 批量插入且忽略重复(INSERT IGNORE)
INSERT IGNORE INTO tags (name)
VALUES ('科技'), ('财经'), ('科技'); -- 第二条科技被忽略
-- 4. 更新 + 条件计数
UPDATE users
SET login_count = login_count + 1,
last_login_ip = '192.168.1.1',
last_login_time = NOW()
WHERE username = 'zhangsan';
-- 5. 查询今天注册的用户
SELECT *
FROM users
WHERE DATE(created_at) = CURDATE();
四、写 SQL 的安全 & 性能小贴士(2026 年视角)
- 永远不要在生产环境写
DELETE FROM table/UPDATE table SET ...而不带 WHERE - 先
SELECT确认影响范围,再改成UPDATE/DELETE - 大批量操作建议:
- 分批 LIMIT + 循环执行
- 或使用
INSERT ... ON DUPLICATE KEY UPDATE
- 字段顺序与表结构一致时可省略列名,但不推荐(可读性差)
TRUNCATE比DELETE FROM快 10~100 倍,但:
- 不能 WHERE
- 清空自增计数
- 不能回滚(非事务安全)
下一期预告:基本查询(下)—— WHERE 条件全家桶 + 模糊查询 + 排序分页 + 聚合函数
有哪个增删改查的写法你觉得最容易出错,或者项目里最常用的模式,欢迎留言讨论~
祝大家 CRUD 写得又稳又快!🛠️