如果是oracle,这里取模好像得加MOD,讲一讲怎么改:
SELECT 编号,ISBN,BookName,Writer FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ISBN) 编号,ISBN,BookName,Writer FROM bookinfo_zerobasis) a WHERE a.编号%2=1;
Oracle 中取模运算的写法
您说得对!Oracle 中取模运算不能直接用 % 符号,需要使用 MOD() 函数。
一、Oracle 中的正确写法
sql
SELECT 编号, ISBN, BookName, Writer FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ISBN) 编号, ISBN, BookName, Writer FROM bookinfo_zerobasis) a WHERE MOD(a.编号, 2) = 1;
二、各数据库取模写法对比
| 数据库 | 取模写法 | 示例 |
|---|---|---|
| MySQL | % 运算符 | a.编号 % 2 = 1 |
| SQL Server | % 运算符 | a.编号 % 2 = 1 |
| PostgreSQL | % 运算符 | a.编号 % 2 = 1 |
| Oracle | MOD() 函数 | MOD(a.编号, 2) = 1 |
三、MOD() 函数详解
语法
sql
MOD(被除数, 除数)
示例
sql
SELECT MOD(5, 2) FROM DUAL; -- 结果:1(5 ÷ 2 = 2 余 1)SELECT MOD(4, 2) FROM DUAL; -- 结果:0(4 ÷ 2 = 2 余 0)SELECT MOD(3, 2) FROM DUAL; -- 结果:1
四、词源角度
| 函数/符号 | 词源 | 含义 |
|---|---|---|
| MOD | 拉丁语 modulus(小度量、尺度) | 取模、求余数 |
% | 拉丁语 per centum(每百) | 百分号,在编程中被复用为取模运算符 |
modulus 的同源词:module(模块)、modify(修改)、moderate(适度)
五、Oracle 完整代码示例
sql
-- 查询奇数行SELECT 编号, ISBN, BookName, Writer FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ISBN) 编号, ISBN, BookName, Writer FROM bookinfo_zerobasis) a WHERE MOD(a.编号, 2) = 1; -- 奇数行-- 查询偶数行SELECT 编号, ISBN, BookName, Writer FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ISBN) 编号, ISBN, BookName, Writer FROM bookinfo_zerobasis) a WHERE MOD(a.编号, 2) = 0; -- 偶数行
六、Oracle 中 DUAL 表说明
在 Oracle 中,SELECT 语句必须带 FROM,所以测试函数时需要用到 DUAL 表:
sql
-- OracleSELECT MOD(5, 2) FROM DUAL; -- 结果:1-- MySQL / SQL Server(可以省略 FROM)SELECT 5 % 2; -- 结果:1
DUAL 是 Oracle 系统自带的虚拟表,只有一行一列,专门用于测试函数或执行无数据源的查询。
七、总结
| 数据库 | 奇数行筛选写法 |
|---|---|
| MySQL / SQL Server / PostgreSQL | WHERE 编号 % 2 = 1 |
| Oracle | WHERE MOD(编号, 2) = 1 |
一句话总结:Oracle 中取模运算需要使用 MOD() 函数,写法为 MOD(编号, 2) = 1 表示筛选奇数行,MOD(编号, 2) = 0 表示筛选偶数行。其他数据库(MySQL、SQL Server、PostgreSQL)可以直接使用 % 运算符