PingKai Logo下载

Oracle 与平凯数据库函数和语法差异对照

本文档提供了 Oracle 与 TiDB 的函数和语法差异对照,方便你根据 Oracle 函数查找对应的 TiDB 函数,了解 Oracle 与 TiDB 语法差异。

函数对照表

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

语法差异

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

字符串语法

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

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

NULL 与空字符串的区分

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

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

INSERT 语句中读写同一张表

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

INSERT INTO table1 VALUES (field1,(SELECT field2 FROM table1 WHERE...))

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

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

获取前 n 行数据

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

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

UPDATE 语句多表更新

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

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

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

UPDATE test1,test2 SET test1.name=test2.name,test1.age=test2.age WHERE test1.id=test2.id

派生表别名

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

SELECT * FROM (SELECT * FROM test)

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

SELECT * FROM (SELECT * FROM test) t

差集运算

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

SELECT * FROM t1 MINUS SELECT * FROM t2

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

SELECT * FROM t1 EXCEPT SELECT * FROM t2

注释语法

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

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

分页查询

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

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

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

SELECT * FROM tables LIMIT 2000 OFFSET 0

ORDER BY 语句对 NULL 的排序规则

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