← 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. 最佳实践

  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/