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

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

    语法差异

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

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

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

    NULL 与空字符串的区分

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

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

    INSERT 语句中读写同一张表

    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 中注释语法为 --注释,其中 -- 后面不需要空格。

    分页查询

    Oracle 分页查询时 OFFSET m 表示跳过 m 行数据,FETCH NEXT n ROWS ONLY 表示取 n 条数据。例如:

    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 COLUM ASC 时,NULL 默认被放在最后。

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

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

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

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

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

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

    Oracle 中的 ORDER BY TiDB 中的 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 name ASC NULLS LAST; SELECT * FROM t1 ORDER BY ISNULL(name), name;