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;