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. 批量操作优先,减少往返成本
相关推荐
ffqws_11 小时前
MyBatis 动态 SQL 详解:从原理到实战
java·sql·mybatis
2401_8463395611 小时前
CSS如何解决Less与CSS兼容性问题_通过配置文件实现平滑过渡与混合开发
jvm·数据库·python
qq_4138474011 小时前
CSS如何控制全屏显示的元素样式
jvm·数据库·python
云动课堂11 小时前
【运维实战】MySQL 8.0 数据库 · 一键自动化部署方案 (适配银河麒麟 V10 / 龙蜥 8 / Rocky Linux 8 / CentOS 8)
linux·运维·数据库
阿正呀12 小时前
CSS粘性定位不生效怎么办_检查父元素高度与overflow属性设置
jvm·数据库·python
2403_8832610912 小时前
如何获取DDL语句_DBMS_METADATA.GET_DDL提取对象定义
jvm·数据库·python
m0_6138562912 小时前
mysql数据库乱码如何解决_mysql字符集与校对规则配置方法
jvm·数据库·python
Bert.Cai12 小时前
MySQL CEIL()函数详解
数据库·mysql
m0_6028577612 小时前
Chart.js 4 中实现基于数据极值的垂直线性渐变填充
jvm·数据库·python
夏恪12 小时前
如何计算SQL同比环比数据_利用窗口函数LAG与LEAD
jvm·数据库·python