MOD()函数仅MySQL/MariaDB原生支持,其他主流数据库如PostgreSQL、SQL Server、Oracle、SQLite均使用%运算符;二者在MySQL中完全等价,但%更简洁且跨库兼容性更好。

MOD 运算符在大多数主流 SQL 方言中并不存在 —— 它只是 MySQL 和 MariaDB 的特有语法,PostgreSQL、SQL Server、Oracle、SQLite 等都用 %(百分号)作为取模运算符。 直接写 MOD(a, b) 在 PostgreSQL 里会报错 ERROR: function mod(integer, integer) does not exist,在 SQL Server 里则根本无法解析。
MySQL/MariaDB 中用 MOD() 函数还是 % 运算符?
MySQL 同时支持 MOD(a, b) 函数和 a % b 运算符,二者语义完全一致。但推荐用 %:它更简洁、可读性更高,且与绝大多数其他数据库保持一致(迁移或共用脚本时少踩坑)。
注意点:
-
MOD(7, 3)和7 % 3都返回1 - 当被除数为负时,MySQL 的
%返回结果符号跟随被除数:-7 % 3→-1,而7 % -3→1(除数符号不影响结果) - 若需跨数据库兼容的“正余数”,得手动调整,例如:
(a % b + b) % b
PostgreSQL/SQL Server/Oracle 中必须用 %,不能用 MOD()
这些系统不识别 MOD() 函数名。PostgreSQL 虽然有内置 mod(a, b) 函数(小写、非大写 MOD),但它是函数调用形式,不是运算符,且行为与 % 一致;SQL Server 和 Oracle 则只认 %。
常见错误场景:
- 从 MySQL 导出的查询复制到 pgAdmin 里执行 → 报错
function mod does not exist - 在 SQL Server Management Studio 中写
SELECT MOD(id, 5) FROM users→ 语法错误,提示“'MOD' is not a recognized built-in function name” - Oracle 中误写
MOD(col, 2) = 0(其实 Oracle 是支持这个函数的,但注意它叫MOD(),不是所有方言都支持——这里反而是个例外)
所以最稳妥的写法是统一用 %,除非你明确锁定 Oracle 或 PostgreSQL 并接受其函数接口。
取模查询典型用法:分页补位、奇偶筛选、哈希分桶
实际业务中,% 多用于条件过滤或计算列,而非单纯数学运算。
举例说明:
- 查 ID 为奇数的记录:
WHERE id % 2 = 1 - 每 10 条做一次统计汇总(模拟窗口分组):
SELECT ..., FLOOR(id / 10.0) AS group_id FROM t GROUP BY group_id,但若想按余数归类(如“每组取第 3 条”),可用HAVING id % 10 = 2 - 给用户分配测试流量(哈希分桶):
WHERE ABS(HASH(customer_id)) % 100 < 5(表示 5% 流量)
注意性能陷阱:在 WHERE 子句中对字段使用 %(如 id % 4 = 0)通常无法利用 B-tree 索引,除非该字段本身是主键且查询条件足够简单,否则可能触发全表扫描。
真正容易被忽略的是负数处理和索引失效这两点:不同数据库对负数取模的定义不统一,而一旦在过滤条件里对列做运算,优化器基本放弃走索引——别指望 created_at % 86400 这种写法还能高效查时间范围。

















