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
语句中读写同一张表。例如:
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 多表更新时不需要列出具体的字段更新关系。例如:
UPDATE test1 SET(test1.name,test1.age) = (SELECT test2.name,test2.age FROM test2 WHERE test2.id=test1.id)
TiDB 多表更新时需要在 SET
时把具体的字段更新关系都列出来。例如:
派生表别名
Oracle 多表查询时,派生表可以不起别名。例如:
SELECT * FROM (SELECT * FROM test)
TiDB 多表查询时,每一个派生出来的表都必须有一个自己的别名。例如:
SELECT * FROM (SELECT * FROM test) t
Oracle 使用 MINUS
进行差集运算。例如:
TiDB 不支持 MINUS
,需要改写为 EXCEPT
进行差集运算。例如:
SELECT * FROM t1 EXCEPT SELECT * FROM t2
注释语法
Oracle 中注释语法为 --注释
,其中 --
后面不需要空格。
TiDB 中注释语法为 -- 注释
,其中 --
后面需要有一个空格。
分页查询
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 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 ISNULL(name), name; |