Oracle ANSI SQL 与 Oracle SQL 对比
Oracle ANSI SQL 与 Oracle SQL 对比
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
ANSI SQL 与 Oracle SQL 对比[1]:
主要差异:
- JOIN 语法
- 数据类型
- 函数
- 序列
- 分页
2. JOIN 语法
2.1 ANSI
-- INNER JOIN
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;
-- LEFT JOIN
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;
-- RIGHT JOIN
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.id;
-- FULL JOIN
SELECT e.name, d.dept_name
FROM employees e
FULL JOIN departments d ON e.dept_id = d.id;
2.2 Oracle
-- INNER JOIN
SELECT e.name, d.dept_name
FROM employees e, departments d
WHERE e.dept_id = d.id;
-- LEFT JOIN(Oracle 旧式)
SELECT e.name, d.dept_name
FROM employees e, departments d
WHERE e.dept_id = d.id(+);
-- RIGHT JOIN
SELECT e.name, d.dept_name
FROM employees e, departments d
WHERE e.dept_id(+) = d.id;
-- FULL JOIN(无旧式,用 UNION)
详细见:Oracle JOIN 连接方式。
3. 字符串
3.1 ANSI
-- 标准
CONCAT('a', 'b')
SUBSTRING('abc' FROM 1 FOR 2)
3.2 Oracle
-- Oracle
'a' || 'b'
SUBSTR('abc', 1, 2)
4. 日期
4.1 ANSI
CURRENT_DATE
CURRENT_TIMESTAMP
EXTRACT(YEAR FROM date_col)
4.2 Oracle
SYSDATE
SYSTIMESTAMP
TO_CHAR(date_col, 'YYYY')
EXTRACT(YEAR FROM date_col)
-- 兼容 ANSI
4.3 日期计算
-- ANSI
date_col + INTERVAL '1' DAY
-- Oracle
date_col + 1
5. 数据类型
| ANSI | Oracle |
|---|---|
| INTEGER | NUMBER(10) |
| VARCHAR | VARCHAR2 |
| TIMESTAMP | TIMESTAMP |
| BOOLEAN | NUMBER(23ai 才支持 BOOLEAN) |
6. 序列
6.1 ANSI
-- 标准方式
NEXT VALUE FOR seq_name
6.2 Oracle
seq_name.NEXTVAL
-- 或 12c+
DEFAULT seq.NEXTVAL
详细见:Oracle 序列与自增列。
7. 分页
7.1 ANSI(12c+)
SELECT * FROM t ORDER BY id
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;
7.2 Oracle 旧式
SELECT * FROM (
SELECT ROWNUM rn, t.* FROM (
SELECT * FROM t ORDER BY id
) t WHERE ROWNUM <= 15
) WHERE rn > 10;
7.3 推荐
- 12c+:FETCH
- 旧版:ROWNUM
详细见:Oracle 12c 新 SQL 特性。
8. NULL 处理
8.1 ANSI
COALESCE(col, 0)
NULLIF(a, b)
8.2 Oracle
NVL(col, 0)
NVL2(col, val1, val2)
COALESCE(col, 0) -- 兼容
NULLIF(a, b) -- 兼容
9. 字符串函数
| 功能 | ANSI | Oracle |
|---|---|---|
| 长度 | CHAR_LENGTH | LENGTH |
| 大写 | UPPER | UPPER |
| 小写 | LOWER | LOWER |
| 替换 | REPLACE | REPLACE |
| 位置 | POSITION | INSTR |
| 子串 | SUBSTRING | SUBSTR |
| 左填充 | LPAD | LPAD |
| 右填充 | RPAD | RPAD |
| 去空格 | TRIM | TRIM |
10. 聚合函数
10.1 ANSI
COUNT(*), SUM(), AVG(), MIN(), MAX()
-- GROUP BY
-- HAVING
10.2 Oracle 额外
-- 分析函数
ROW_NUMBER() OVER (...)
RANK() OVER (...)
DENSE_RANK() OVER (...)
LAG() OVER (...)
LEAD() OVER (...)
详细见:Oracle 分析函数。
11. CASE 表达式
-- 兼容
CASE
WHEN condition THEN result
ELSE default
END
-- 简单
CASE col
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'other'
END
12. DECODE
12.1 Oracle 专有
DECODE(col, 1, 'one', 2, 'two', 'other')
12.2 vs CASE
- CASE:标准
- DECODE:Oracle 专有
- 推荐 CASE
13. 集合操作
| ANSI | Oracle |
|---|---|
| UNION | UNION |
| UNION ALL | UNION ALL |
| INTERSECT | INTERSECT |
| EXCEPT | MINUS |
详细见:Oracle SQL 集合操作。
14. Dual 表
14.1 Oracle
SELECT SYSDATE FROM dual;
SELECT 1 + 1 FROM dual;
14.2 ANSI
-- 不需要
SELECT CURRENT_DATE;
SELECT 1 + 1;
14.3 Oracle 23ai
-- 23ai 支持
SELECT SYSDATE;
15. 自动递增
15.1 ANSI
CREATE TABLE t (
id INTEGER GENERATED ALWAYS AS IDENTITY
);
15.2 Oracle 12c+
CREATE TABLE t (
id NUMBER GENERATED ALWAYS AS IDENTITY
);
-- 兼容
详细见:Oracle 序列与自增列。
16. WITH 子句
16.1 兼容
WITH cte AS (...)
SELECT * FROM cte;
16.2 递归
-- ANSI(11g R2+ Oracle 支持)
WITH RECURSIVE cte AS (...)
SELECT * FROM cte;
详细见:Oracle WITH 子句与递归查询。
17. 异构兼容
17.1 字符串
-- 兼容
CONCAT(a, b) -- 标准
a || b -- Oracle
17.2 日期
-- 兼容
EXTRACT(YEAR FROM date_col)
17.3 NULL
-- 兼容
COALESCE(col, 0)
18. 迁移注意
18.1 数据类型
- VARCHAR → VARCHAR2
- INTEGER → NUMBER(10)
- BOOLEAN → NUMBER
- DATETIME → DATE/TIMESTAMP
18.2 函数
- POSITION → INSTR
- SUBSTRING → SUBSTR
- CHAR_LENGTH → LENGTH
18.3 SQL 语法
- JOIN:ANSI 推荐
- 分页:FETCH(12c+)
- 序列:NEXTVAL
19. 最佳实践
- ANSI JOIN:标准
- FETCH 分页:12c+
- CASE 替代 DECODE:标准
- COALESCE:兼容
- EXTRACT:日期
- IDENTITY:自增
- 避免 (+):旧式
- 测试兼容:跨库
- 统一风格:维护
- 文档化:差异
20. 参考资料
[1] Oracle Database SQL Language Reference 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/