说明

基础的单表增删改查和左右连接,六大数据库完全一致,不再赘述。本文只记录有差异的语法点,按“基础常用”到“高级特性”排序。OceanBase 区分 Oracle 模式和 MySQL 模式,使用时需确认当前模式。


一、基础常用差异

1. 分页查询

数据库写法
Oracle 12c+OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
MySQLLIMIT 10 OFFSET 10
SQL Server 2012+OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
达梦LIMIT 10 OFFSET 10(也支持 Oracle 的 OFFSET FETCH)
人大金仓LIMIT 10 OFFSET 10
OceanBaseMySQL模式用 LIMIT 10 OFFSET 10,Oracle模式用 OFFSET FETCH

2. 自增主键

数据库写法
Oracle 12c+id NUMBER GENERATED BY DEFAULT AS IDENTITY
MySQLid INT AUTO_INCREMENT PRIMARY KEY
SQL Serverid INT IDENTITY(1,1) PRIMARY KEY
达梦id INT IDENTITY(1,1) PRIMARY KEY
人大金仓id SERIAL PRIMARY KEY 或 IDENTITY
OceanBaseMySQL模式用 AUTO_INCREMENT,Oracle模式用序列

3. 字符串连接

数据库写法
Oracle / 达梦 / 人大金仓'a' || 'b'
MySQLCONCAT('a', 'b')
SQL Server'a' + 'b'
OceanBaseOracle模式用 ||,MySQL模式用 CONCAT

4. 获取当前时间

数据库写法
Oracle / 达梦 / 人大金仓SYSDATE
MySQLNOW()
SQL ServerGETDATE()
OceanBaseOracle模式用 SYSDATE,MySQL模式用 NOW()

5. 空值处理

数据库写法
Oracle / 达梦 / 人大金仓NVL(col, '默认值')
MySQLIFNULL(col, '默认值')
SQL ServerISNULL(col, '默认值')
OceanBaseOracle模式用 NVL,MySQL模式用 IFNULL

所有数据库都支持通用标准写法:COALESCE(col, '默认值')

6. 字符串截取

数据库写法
Oracle / 达梦 / 人大金仓SUBSTR(str, start, length)
MySQLSUBSTR(str, start, length) 或 SUBSTRING
SQL ServerSUBSTRING(str, start, length)
OceanBase两种模式都支持 SUBSTR / SUBSTRING

二、进阶差异

7. 关联删除(根据另一个表的数据删除)

数据库写法
MySQLDELETE t1 FROM t1 JOIN t2 ON t1.id = t2.id WHERE t2.status = 'expired'
Oracle / 达梦 / 人大金仓DELETE FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.id = t2.id AND t2.status = 'expired')
SQL ServerDELETE t1 FROM t1 JOIN t2 ON t1.id = t2.id WHERE t2.status = 'expired'
OceanBaseOracle模式用 EXISTS,MySQL模式用 JOIN

8. 关联更新(根据另一个表的数据更新)

数据库写法
MySQLUPDATE t1 JOIN t2 ON t1.id = t2.id SET t1.name = t2.new_name
Oracle / 达梦 / 人大金仓UPDATE t1 SET name = (SELECT new_name FROM t2 WHERE t1.id = t2.id) WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.id = t2.id)
SQL ServerUPDATE t1 SET t1.name = t2.new_name FROM t1 JOIN t2 ON t1.id = t2.id
OceanBaseOracle模式用子查询,MySQL模式用 JOIN

9. 插入时处理重复主键

数据库写法
MySQLINSERT INTO t(id, name) VALUES(1, 'new') ON DUPLICATE KEY UPDATE name = 'new'
Oracle / 达梦 / 人大金仓MERGE INTO t USING dual ON (t.id = 1) WHEN MATCHED THEN UPDATE SET name = 'new' WHEN NOT MATCHED THEN INSERT (id, name) VALUES (1, 'new')
SQL ServerMERGE INTO t USING (SELECT 1 AS id) s ON t.id = s.id WHEN MATCHED THEN UPDATE SET name = 'new' WHEN NOT MATCHED THEN INSERT (id, name) VALUES (1, 'new')
OceanBaseOracle模式用 MERGE,MySQL模式用 ON DUPLICATE KEY

10. 类型转换

数据库写法
Oracle / 达梦 / 人大金仓TO_CHAR(date, 'YYYY-MM-DD')、TO_NUMBER('123')、TO_DATE('2026-06-20', 'YYYY-MM-DD')
MySQLDATE_FORMAT(date, '%Y-%m-%d')、CAST('123' AS UNSIGNED)、STR_TO_DATE('2026-06-20', '%Y-%m-%d')
SQL ServerCONVERT(VARCHAR, date, 23)、CAST('123' AS INT)、CONVERT(DATETIME, '2026-06-20', 20)
OceanBaseOracle模式用 TO_CHAR/TO_NUMBER/TO_DATE,MySQL模式用 DATE_FORMAT/CAST/STR_TO_DATE

11. 日期运算

数据库写法
Oracle / 达梦 / 人大金仓SYSDATE + 7(7天后)、MONTHS_BETWEEN(d1, d2)(相差月份)
MySQLDATE_ADD(NOW(), INTERVAL 7 DAY)、DATEDIFF(d1, d2)(相差天数)
SQL ServerDATEADD(DAY, 7, GETDATE())、DATEDIFF(DAY, d1, d2)
OceanBaseOracle模式用 SYSDATE + N,MySQL模式用 DATE_ADD/DATEDIFF

12. 表结构复制

数据库写法
Oracle / 达梦 / 人大金仓CREATE TABLE t_backup AS SELECT * FROM t
MySQLCREATE TABLE t_backup LIKE t(仅结构)、CREATE TABLE t_backup AS SELECT * FROM t(结构+数据)
SQL ServerSELECT * INTO t_backup FROM t
OceanBaseOracle模式用 CREATE TABLE ... AS SELECT,MySQL模式用 LIKE 或 AS SELECT

13. 批量插入

数据库写法
MySQL / SQL Server / 达梦 / 人大金仓INSERT INTO t(col1, col2) VALUES (v1, v2), (v3, v4), (v5, v6)
Oracle(12c前)需用 INSERT ALL INTO t(col1, col2) VALUES (v1, v2) INTO t(col1, col2) VALUES (v3, v4) SELECT 1 FROM dual
Oracle 12c+支持标准批量写法
OceanBaseMySQL模式支持标准批量写法,Oracle模式12c+也支持

14. TRUNCATE 差异

数据库特点
MySQLTRUNCATE 重置自增计数器,DELETE 不重置
OracleTRUNCATE 是 DDL,不能回滚;DELETE 是 DML,可以回滚
SQL ServerTRUNCATE 需要较高权限
达梦 / 人大金仓与 Oracle 行为一致
OceanBase与对应模式的行为一致

15. DELETE 和 UPDATE 带别名

数据库DELETE 带别名UPDATE 带别名
MySQLDELETE t1 FROM t1 WHERE t1.id = 1UPDATE t1 SET t1.name = 'new' WHERE t1.id = 1
Oracle / 达梦 / 人大金仓DELETE FROM t1 WHERE id = 1(不需要别名)UPDATE t1 SET name = 'new' WHERE id = 1
SQL Server同 MySQL同 MySQL
OceanBase与对应模式的行为一致

三、通用写法速记(跨数据库兼容)

操作通用写法
关联删除DELETE FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE ...)
关联更新UPDATE t1 SET col = (SELECT col FROM t2 WHERE ...) WHERE EXISTS (...)
插入或更新MERGE INTO ... USING ... ON ... WHEN MATCHED ... WHEN NOT MATCHED ...
空值处理COALESCE(col, '默认值')(所有数据库通用)
分页(标准)OFFSET ... ROWS FETCH NEXT ... ROWS ONLY(Oracle 12c+、SQL Server 2012+、达梦、金仓)
分页(通用)MySQL和OceanBase MySQL模式用 LIMIT ... OFFSET ...,其余用 OFFSET FETCH

四、Oracle 老式写法(兼容但不推荐)

操作老式写法推荐写法
左连接WHERE t1.id = t2.id(+)LEFT JOIN ... ON ...
右连接WHERE t1.id(+) = t2.idRIGHT JOIN ... ON ...

达梦、人大金仓兼容这种老式写法,但新代码不建议使用。


整理完发现,最基础的增删改查和左右连接语法所有数据库都一致,差异集中在分页、自增主键、函数、类型转换、关联操作这几个领域。国产数据库大多做了 Oracle 或 MySQL 兼容,迁移成本比几年前低了很多,但关键业务建议实测一遍。供参考,也方便自己回头查阅。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐