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. 数据类型

ANSIOracle
INTEGERNUMBER(10)
VARCHARVARCHAR2
TIMESTAMPTIMESTAMP
BOOLEANNUMBER(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. 字符串函数

功能ANSIOracle
长度CHAR_LENGTHLENGTH
大写UPPERUPPER
小写LOWERLOWER
替换REPLACEREPLACE
位置POSITIONINSTR
子串SUBSTRINGSUBSTR
左填充LPADLPAD
右填充RPADRPAD
去空格TRIMTRIM

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. 集合操作

ANSIOracle
UNIONUNION
UNION ALLUNION ALL
INTERSECTINTERSECT
EXCEPTMINUS

详细见: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. 最佳实践

  1. ANSI JOIN:标准
  2. FETCH 分页:12c+
  3. CASE 替代 DECODE:标准
  4. COALESCE:兼容
  5. EXTRACT:日期
  6. IDENTITY:自增
  7. 避免 (+):旧式
  8. 测试兼容:跨库
  9. 统一风格:维护
  10. 文档化:差异

20. 参考资料

[1] Oracle Database SQL Language Reference 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/