SQL 中如何计算分组移动平均值?

分组移动平均在 SQL 里不难,真正容易出错的是窗口怎么定义、分组是否隔离,以及数据库版本对 `ROWS`、`RANGE` 的支持差异。本文按 MySQL、PostgreSQL、SQL Server 与 SQLite 分别梳理可用写法,并补上边界行与 `NULL` 处理时最常见的误区。

SQL 中如何计算分组移动平均值?

SQL 子查询如何统计每个分类的记录数量

统计“每个分类有多少条记录”时,关键不在子查询本身,而在是否按分类分组。多数场景应优先用 LEFT JOIN + GROUP BY,既能保留数量为 0 的分类,也比相关子查询更稳定;只有在报表工具或语法受限时,再考虑相关子查询。

SQL 子查询如何统计每个分类的记录数量

SQL 中 GROUP BY 语法正确却报错,通常卡在哪一步?

`GROUP BY` 语法看起来没问题却报错,通常不是拼写失误,而是数据库在拦截“结果不确定”的查询。本文从报错含义、常见误判、分组键设计、`ORDER BY` 别名可见性,到 `ANY_VALUE()` 的适用边界,梳理出更稳妥的排查与改写方式。

SQL 中 GROUP BY 语法正确却报错,通常卡在哪一步?

SQL 触发器为什么无法直接更新复杂视图

复杂视图之所以不能像表一样直接更新,核心不在语法,而在数据库是否愿意替你拆解 DML。SQL Server 允许借助 INSTEAD OF 触发器接管写入,但所有分发表、字段映射和校验都要手写;MySQL 则直接禁止在视图上创建触发器。

SQL 触发器为什么无法直接更新复杂视图

SQL 存储过程如何选择临时表或表变量

在 SQL Server 存储过程中,`#temp` 和 `@table` 不是随手替换的两种写法。判断关键不在“能不能存”,而在数据量、是否复用、是否参与 JOIN 与事务,以及优化器能否拿到统计信息;一旦越界,执行计划和作用域问题会直接放大。

SQL 存储过程如何选择临时表或表变量

SQL 子查询如何查询连续登录用户

查询连续登录用户,关键不在“找前一天是否存在”,而在把无断档的日期序列识别成同一段。本文围绕连续登录定义、`ROW_NUMBER()` 分组写法、MySQL 5.7 替代方案与 `LEAD/LAG` 适用边界,整理出更适合上线使用的 SQL 思路。

SQL 子查询如何查询连续登录用户

怎样用 SQL 日期函数统计自然月环比

统计自然月环比,难点不在公式本身,而在“按日历月对齐”和“上月值如何准确关联”。本文按 MySQL 8.0+ 与 5.7 及以下两种场景,整理可直接套用的 SQL 写法,并补出时区、空值、除零和时间口径这些最容易让结果失真的细节。

怎样用 SQL 日期函数统计自然月环比

如何编写单元测试验证 SQL 注入防护

单元测试要验证的不是“接口没报错”,而是恶意输入是否在数据库执行前就被业务层拦截。本文围绕真实攻击载荷传递、异常断言、高危拼接分支、日志审计和二次注入覆盖,整理一套更可靠的 SQL 注入防护测试思路。

如何编写单元测试验证 SQL 注入防护

怎样用 SQL 条件聚合生成横向统计报表

在 SQL 里做横向统计报表时,`SUM(CASE WHEN ...)` 往往比 `PIVOT` 更实用,因为它跨数据库可用、逻辑直观,也更方便处理空值与动态分类。本文结合常见踩坑,说明何时该用 `SUM`、何时该用 `MAX` 或 `COUNT`,以及分类不固定时该怎样设计。

怎样用 SQL 条件聚合生成横向统计报表

SQL JOIN 中使用函数为什么会变慢

在 SQL 的 JOIN 条件里直接套 `UPPER()`、`DATE()` 这类函数,常见后果不是“多算几次”那么简单,而是优化器放弃索引、执行计划退化成扫描。本文从索引失效的原因、`COLLATE` 误区到两条可行优化路径,说明该怎么判断问题并改写 SQL。

SQL JOIN 中使用函数为什么会变慢

Ruby 常见攻击防范指南:从输入验证到会话与 HTTPS 加固

这篇文章围绕 Ruby Web 应用最常见的几类安全风险展开,梳理输入验证、会话与 CSRF、防密码明文、HTTPS 传输以及日志监控等基础做法,并保留 Rails、bcrypt、Nginx 等原始示例,便于直接对照检查项目配置。 Ruby Web 应用的安全问题,往往不是出在框架能力不足,而是出在一些看似基础的细节没有落实,比如直接拼接 SQL、会话配置过松、密码明文存。

Ruby 常见攻击防范指南:从输入验证到会话与 HTTPS 加固