Oracle 与 TiDB 函数和语法差异对照

    注意

    本文的内容是基于 Oracle 12.2.0.1.0 和 TiDB v5.4.0,其他版本可能存在差异。

    下表列出了 Oracle 与 TiDB 部分函数的对照表。

    语法差异

    本节介绍 Oracle 部分语法与 TiDB 的差异。

    Oracle 中字符串只能使用单引号 (‘’)。例如 'a'

    TiDB 中字符串可以使用单引号 (‘’) 或双引号 (“”)。例如 'a'"a"

    NULL 与空字符串的区分

    Oracle 中不区分 NULL 和空字符串 '',即 NULL'' 是等价的。

    TiDB 中区分 NULL 和空字符串 ''

    语句中读写同一张表

    Oracle 支持 INSERT 语句中读写同一张表。例如:

    1. INSERT INTO table1 VALUES (feild1,(SELECT T.fields2 FROM table1 T WHERE...))

    Oracle 通过 ROWNUM <= n 获取前 n 行数据。例如,ROWNUM <= 10

    TiDB 通过 LIMIT n 获取前 n 行数据。例如,LIMIT 10。Hibernate Query Language (HQL) 方式运行带 LIMIT 的 SQL 语句会出现错误,需要将 Hibernate 的运行方式改为 SQL 方式运行。

    UPDATE 语句多表更新

    Oracle 多表更新时不需要列出具体的字段更新关系。例如:

    1. UPDATE test1 SET(test1.name,test1.age) = (SELECT test2.name,test2.age FROM test2 WHERE test2.id=test1.id)

    TiDB 多表更新时需要在 SET 时把具体的字段更新关系都列出来。例如:

    派生表别名

    Oracle 多表查询时,派生表可以不起别名。例如:

    1. SELECT * FROM (SELECT * FROM test)

    TiDB 多表查询时,每一个派生出来的表都必须有一个自己的别名。例如:

    1. SELECT * FROM (SELECT * FROM test) t

    Oracle 使用 MINUS 进行差集运算。例如:

    TiDB 不支持 MINUS,需要改写为 EXCEPT 进行差集运算。例如:

    1. SELECT * FROM t1 EXCEPT SELECT * FROM t2

    注释语法

    Oracle 中注释语法为 --注释,其中 -- 后面不需要空格。

    TiDB 中注释语法为 -- 注释,其中 -- 后面需要有一个空格。

    分页查询

    1. SELECT * FROM tables OFFSET 0 ROWS FETCH NEXT 2000 ROWS ONLY

    TiDB 使用 LIMIT n OFFSET m 等价改写 OFFSET m ROWS FETCH NEXT n ROWS ONLY。例如:

    Oracle 中 ORDER BY 语句对 NULL 的排序规则:

    • ORDER BY COLUMN ASC 时,NULL 默认被放在最后。

    • ORDER BY COLUMN DESC 时,NULL 默认被放在最前。

    • ORDER BY COLUMN [ASC|DESC] NULLS FIRST 时,强制 NULL 放在最前,非 NULL 的值仍然按声明顺序 ASC|DESC 进行排序。

    • ORDER BY COLUMN [ASC|DESC] NULLS LAST 时,强制 NULL 放在最后,非 NULL 的值仍然按声明顺序 ASC|DESC 进行排序。

    TiDB 中 ORDER BY 语句对 NULL 的排序规则:

    • ORDER BY COLUMN ASC 时,NULL 默认被放在最前。

    • ORDER BY COLUMN DESC 时,NULL 默认被放在最后。

    下表是 Oracle 与 TiDB 中等价 ORDER BY 语句示例:

    Oracle 中的 ORDER BYTiDB 中的 ORDER BY
    SELECT FROM t1 ORDER BY name NULLS FIRST;SELECT FROM t1 ORDER BY name;
    SELECT FROM t1 ORDER BY name DESC NULLS LAST;SELECT FROM t1 ORDER BY name DESC;
    SELECT FROM t1 ORDER BY name DESC NULLS FIRST;SELECT FROM t1 ORDER BY ISNULL(name) DESC, name DESC;
    SELECT FROM t1 ORDER BY ISNULL(name), name;