MySQL 常用业务 SQL

这篇更贴近"日常写业务"的 SQL,不讲理论,强调能直接拿去改。

一、按时间范围的常用查询

sql 复制代码
-- 最近 7 天订单
SELECT *
FROM orders
WHERE create_time >= NOW() - INTERVAL 7 DAY;

-- 指定日期
SELECT *
FROM orders
WHERE create_time >= '2026-04-01 00:00:00'
  AND create_time <  '2026-04-02 00:00:00';

二、状态机更新(防止重复更新)

sql 复制代码
-- 只允许从 UNPAID -> PAID
UPDATE orders
SET status = 'PAID', pay_time = NOW()
WHERE id = ? AND status = 'UNPAID';

三、库存扣减(防止超卖)

sql 复制代码
UPDATE stock
SET quantity = quantity - 1
WHERE sku_id = ? AND quantity > 0;

配套判断:受影响行数为 0 就表示库存不足。


四、批量更新(避免一条条改)

sql 复制代码
UPDATE user
SET status = 'DISABLED'
WHERE last_login < NOW() - INTERVAL 180 DAY;

五、存在即更新(UPSERT)

sql 复制代码
INSERT INTO user_profile (user_id, nickname, avatar)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE
nickname = VALUES(nickname),
avatar = VALUES(avatar);

六、批量插入(提高吞吐)

sql 复制代码
INSERT INTO audit_log (user_id, action, create_time)
VALUES
  (101, 'LOGIN', NOW()),
  (102, 'LOGIN', NOW()),
  (103, 'LOGIN', NOW());

七、分页查询(业务常规)

sql 复制代码
-- 传统分页(页数不大可用)
SELECT id, user_id, status, create_time
FROM orders
ORDER BY create_time DESC
LIMIT 0, 20;
sql 复制代码
-- 游标分页(更稳)
SELECT id, user_id, status, create_time
FROM orders
WHERE (create_time < ? OR (create_time = ? AND id < ?))
ORDER BY create_time DESC, id DESC
LIMIT 20;

八、模糊搜索(建议加前缀)

sql 复制代码
-- 前缀匹配可用索引
SELECT * FROM user WHERE nickname LIKE '张%';

%张% 这种全模糊通常走不到索引。


九、查重(业务常用)

sql 复制代码
SELECT email, COUNT(*) AS cnt
FROM user
GROUP BY email
HAVING cnt > 1;

十、取某用户最新一条记录

sql 复制代码
SELECT *
FROM login_log
WHERE user_id = ?
ORDER BY create_time DESC
LIMIT 1;

十一、报表类统计(按天聚合)

sql 复制代码
SELECT DATE(create_time) AS day, COUNT(*) AS cnt
FROM orders
WHERE create_time >= NOW() - INTERVAL 30 DAY
GROUP BY day
ORDER BY day;

十二、快速排除无效数据

sql 复制代码
SELECT *
FROM orders
WHERE status IN ('PAID', 'SHIPPED')
  AND deleted = 0;

最后总结

这类业务 SQL 的核心是三点:

  1. 写法清晰、能命中索引
  2. 更新条件有约束,避免重复或越界
  3. 批量操作优先,减少往返成本
相关推荐
知识分享小能手2 小时前
MongoDB入门学习教程,从入门到精通,MongoDB的选择片键 - 完整知识点(16)
数据库·学习·mongodb
知识分享小能手2 小时前
MongoDB入门学习教程,从入门到精通,MongoDB分片配置完全指南(15)
数据库·学习·mongodb
y = xⁿ2 小时前
【MySQL】数据库的脏读,不可重复读和幻读,覆盖索引是什么,索引类型有哪些
数据库·mysql
小冷coding3 小时前
【面试】结合项目整理的场景面试题,覆盖 Java 基础、锁、多线程、数据库、分布式锁 / 事务、消息中间件等核心维度
java·数据库·面试
kcuwu.3 小时前
Python 正则表达式从入门到实战
数据库·python·正则表达式
卓怡学长3 小时前
m319个人网站的设计与实现
java·数据库·spring·tomcat·maven·intellij-idea
羊小蜜.3 小时前
Mysql 07: 正则表达式查询(REGEXP)全解
数据库·mysql·正则表达式
Dxy12393102163 小时前
正则表达式如何匹配提取文章日期
数据库·mysql·正则表达式
元宝骑士3 小时前
MySQL联表查询优化实战:小表驱动大表的联合索引设计
后端·mysql