数据库语法对比详细规则

本文档定义 GaussDB、OceanBase、SQLServer、达梦 (DM8)、人大金仓 (KingbaseES)、MySQL 六种数据库之间的语法差距。

1. 数据类型映射

数据类型 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
整数 INT / INTEGER INT INT INT / INTEGER INT / INTEGER INT
长整数 BIGINT BIGINT BIGINT BIGINT BIGINT BIGINT
小整数 SMALLINT SMALLINT SMALLINT SMALLINT SMALLINT SMALLINT
浮点 NUMERIC(p,s) DECIMAL(p,s) DECIMAL(p,s) DECIMAL(p,s) / NUMERIC(p,s) NUMERIC(p,s) DECIMAL(p,s)
字符串 (定长) CHAR(n) CHAR(n) CHAR(n) CHAR(n) CHAR(n) CHAR(n)
字符串 (变长) VARCHAR(n) VARCHAR(n) VARCHAR(n) / NVARCHAR(n) VARCHAR(n) / VARCHAR2(n) VARCHAR(n) VARCHAR(n)
大文本 TEXT TEXT / LONGTEXT NVARCHAR(MAX) / TEXT TEXT / CLOB TEXT TEXT / LONGTEXT
日期 DATE DATE DATE DATE DATE DATE
时间 TIME TIME TIME TIME TIME TIME
日期时间 TIMESTAMP DATETIME DATETIME / DATETIME2 TIMESTAMP / DATETIME TIMESTAMP DATETIME / TIMESTAMP
布尔 BOOLEAN TINYINT(1) BIT BIT BOOLEAN TINYINT(1)
二进制 BYTEA BLOB VARBINARY(MAX) BLOB / VARBINARY BYTEA BLOB / LONGBLOB
JSON JSON / JSONB JSON NVARCHAR(MAX) JSON JSON / JSONB JSON

2. 自增主键

GaussDB (序列方式)

sql 复制代码
CREATE SEQUENCE table_id_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE example (
    id INT NOT NULL DEFAULT nextval('table_id_seq'),
    name VARCHAR(100),
    PRIMARY KEY (id)
);

OceanBase (AUTO_INCREMENT)

sql 复制代码
CREATE TABLE example (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100),
    PRIMARY KEY (id)
) AUTO_INCREMENT = 1;

SQLServer (IDENTITY)

sql 复制代码
CREATE TABLE example (
    id INT IDENTITY(1,1) NOT NULL,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

达梦 (DM8)

sql 复制代码
-- 方式1:IDENTITY 兼容SQLServer
CREATE TABLE example (
    id INT IDENTITY(1,1) NOT NULL,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

-- 方式2:序列
CREATE SEQUENCE table_id_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE example (
    id INT NOT NULL DEFAULT table_id_seq.NEXTVAL,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

人大金仓 (KingbaseES)

sql 复制代码
-- 同PostgreSQL,序列/IDENTITY 双支持
CREATE TABLE example (
    id INT GENERATED AS IDENTITY,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

-- 序列方式
CREATE SEQUENCE table_id_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE example (
    id INT NOT NULL DEFAULT nextval('table_id_seq'),
    name VARCHAR(100),
    PRIMARY KEY (id)
);

MySQL (AUTO_INCREMENT)

sql 复制代码
CREATE TABLE example (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100),
    PRIMARY KEY (id)
) AUTO_INCREMENT = 1;

转换规则

  • 其他库 → MySQL:IDENTITY/nextval/ 序列 → 统一改为 AUTO_INCREMENT
  • MySQL → 其他库:AUTO_INCREMENT → Gauss / 金仓用序列,达梦用 IDENTITY / 序列,SQLServer 用 IDENTITY

3. 分页查询

GaussDB

sql 复制代码
SELECT * FROM table LIMIT 10 OFFSET 20;

OceanBase

sql 复制代码
SELECT * FROM table LIMIT 20, 10;

SQLServer

sql 复制代码
SELECT * FROM table 
ORDER BY id 
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

达梦 (DM8)

sql 复制代码
-- 兼容Oracle/PG/SQLServer
SELECT * FROM table WHERE ROWNUM <=10;
-- 标准分页
SELECT * FROM table LIMIT 10 OFFSET 20;
-- 兼容SQLServer
SELECT * FROM table ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

人大金仓 (KingbaseES)

sql 复制代码
-- 标准PG语法
SELECT * FROM table LIMIT 10 OFFSET 20;
-- 兼容Oracle
SELECT * FROM (SELECT t.*,ROWNUM rn FROM table t) WHERE rn BETWEEN 21 AND 30;

MySQL

sql 复制代码
SELECT * FROM table LIMIT 20, 10;
-- 标准写法
SELECT * FROM table LIMIT 10 OFFSET 20;

转换规则

  • MySQL ↔ OceanBase:分页语法完全一致
  • MySQL → Gauss / 金仓 / 达梦:LIMIT m,n 改为 LIMIT n OFFSET m
  • MySQL → SQLServer:改为 OFFSET m ROWS FETCH NEXT n ROWS ONLY

4. 字符串函数

功能 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
字符串拼接 `a b` CONCAT(a, b) a + b CONCAT() 或 `
获取字符串长度 LENGTH(s) LENGTH(s)CHAR_LENGTH(s) LEN(s) LENGTH(s) LENGTH(s) LENGTH(s)CHAR_LENGTH(s)
字符串截取 SUBSTRING(s, start, len) SUBSTRING(s, start, len) SUBSTRING(s, start, len) SUBSTRING(s, start, len) SUBSTRING(s, start, len) SUBSTRING(s, start, len)
左侧截取 LEFT(s, n) LEFT(s, n) LEFT(s, n) LEFT(s, n) LEFT(s, n) LEFT(s, n)
右侧截取 RIGHT(s, n) RIGHT(s, n) RIGHT(s, n) RIGHT(s, n) RIGHT(s, n) RIGHT(s, n)
去除首尾空格 TRIM(s) TRIM(s) LTRIM(RTRIM(s)) TRIM(s) TRIM(s) TRIM(s)
转大写 UPPER(s) UPPER(s) UPPER(s) UPPER(s) UPPER(s) UPPER(s)
转小写 LOWER(s) LOWER(s) LOWER(s) LOWER(s) LOWER(s) LOWER(s)
字符串替换 REPLACE(s, a, b) REPLACE(s, a, b) REPLACE(s, a, b) REPLACE(s, a, b) REPLACE(s, a, b) REPLACE(s, a, b)
查找字符位置 POSITION(sub IN s) LOCATE(sub, s)INSTR(s, sub) CHARINDEX(sub, s) INSTR(s, sub)CHARINDEX POSITION(sub IN s)INSTR INSTR(s, sub)LOCATE

5. 日期时间函数

功能 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
获取当前日期时间 CURRENT_TIMESTAMPNOW() NOW()CURRENT_TIMESTAMP GETDATE()SYSDATETIME() SYSDATENOW() NOW()CURRENT_TIMESTAMP NOW()SYSDATE()
获取当前日期 CURRENT_DATE CURDATE() CAST(GETDATE() AS DATE) TRUNC(SYSDATE) CURRENT_DATE CURDATE()
日期格式化 TO_CHAR(d, 'YYYY-MM-DD') DATE_FORMAT(d, '%Y-%m-%d') FORMAT(d, 'yyyy-MM-dd') TO_CHAR(d, 'YYYY-MM-DD') TO_CHAR(d, 'YYYY-MM-DD') DATE_FORMAT(d, '%Y-%m-%d')
字符串转日期 TO_DATE(s, 'YYYY-MM-DD') STR_TO_DATE(s, '%Y-%m-%d') CONVERT(DATE, s, 23) TO_DATE(s, 'YYYY-MM-DD') TO_DATE(s, 'YYYY-MM-DD') STR_TO_DATE(s, '%Y-%m-%d')
日期加减运算 d + INTERVAL '1 day' DATE_ADD(d, INTERVAL 1 DAY) DATEADD(DAY, 1, d) DATEADD(d, 1, 'DAY') d + INTERVAL '1 day' DATE_ADD(d, INTERVAL 1 DAY)
计算日期差值 d1 - d2 DATEDIFF(d1, d2) DATEDIFF(DAY, d2, d1) DATEDIFF(d1, d2) d1 - d2DATEDIFF(d1,d2) DATEDIFF(d1, d2)
提取年份 EXTRACT(YEAR FROM d) YEAR(d) YEAR(d) YEAR(d)EXTRACT(YEAR FROM d) EXTRACT(YEAR FROM d) YEAR(d)
提取月份 EXTRACT(MONTH FROM d) MONTH(d) MONTH(d) MONTH(d) EXTRACT(MONTH FROM d) MONTH(d)
提取日期 EXTRACT(DAY FROM d) DAY(d) DAY(d) DAY(d) EXTRACT(DAY FROM d) DAY(d)

6. 条件函数

功能 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
空值替换 COALESCE(a, b) IFNULL(a, b)COALESCE(a, b) ISNULL(a, b)COALESCE(a, b) NVL(a, b)COALESCE(a, b) COALESCE(a, b)NVL(a, b) IFNULL(a,b)COALESCE(a,b)
多条件判断 CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END
简易 IF 判断 CASE WHEN cond THEN a ELSE b END IF(cond, a, b) IIF(cond, a, b) IF(cond, a, b)CASE CASE WHEN cond THEN a ELSE b END IF(cond, a, b)
相等置空 NULLIF(a, b) NULLIF(a, b) NULLIF(a, b) NULLIF(a, b) NULLIF(a, b) NULLIF(a, b)

7. 聚合与分组函数

功能 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
字符串行转列聚合 STRING_AGG(col, ',') GROUP_CONCAT(col SEPARATOR ',') STRING_AGG(col, ',') WM_CONCAT(col)STRING_AGG STRING_AGG(col, ',') GROUP_CONCAT(col SEPARATOR ',')
去重统计数量 COUNT(DISTINCT col) COUNT(DISTINCT col) COUNT(DISTINCT col) COUNT(DISTINCT col) COUNT(DISTINCT col) COUNT(DISTINCT col)

8. 表结构语法

字段注释

sql 复制代码
-- GaussDB / 达梦 / 人大金仓
COMMENT ON COLUMN table.col IS '注释';

-- OceanBase / MySQL
col VARCHAR(100) COMMENT '注释';

-- SQLServer
EXEC sp_addextendedproperty 'MS_Description','注释','SCHEMA','dbo','TABLE','table','COLUMN','col';

索引创建

sql 复制代码
-- 六库通用基础索引
CREATE INDEX idx_name ON table(col);

-- 人大金仓 指定索引类型
CREATE INDEX idx_name ON table USING btree(col);

-- 达梦 聚集索引
CREATE CLUSTER INDEX idx_name ON table(col);

9. 特殊语法

插入或更新(UPSERT)

sql 复制代码
-- GaussDB、人大金仓
INSERT INTO t VALUES(1,'test') ON CONFLICT(id) DO UPDATE SET name=EXCLUDED.name;

-- OceanBase、MySQL
INSERT INTO t VALUES(1,'test') ON DUPLICATE KEY UPDATE name=VALUES(name);

-- SQLServer、达梦
MERGE INTO t USING(VALUES(1,'test')) s ON t.id=s.id
WHEN MATCHED THEN UPDATE SET name=s.name
WHEN NOT MATCHED THEN INSERT(id,name)VALUES(s.id,s.name);

批量插入数据

六种数据库语法完全通用

sql 复制代码
INSERT INTO table(col1,col2)VALUES(1,'a'),(2,'b'),(3,'c');

整体总结

  1. MySQL 与 OceanBase 语法高度同源,分页、自增、更新插入、常用函数基本无差异
  2. GaussDB 与人大金仓均基于 PostgreSQL 内核,语法互通性最强,迁移改造量最小
  3. 达梦数据库兼容性最强,同时支持 Oracle、SQLServer、MySQL、PG 主流语法
  4. SQLServer 私有语法最多,字符拼接、系统时间、分页语法独有的特性多,跨库迁移改写工作量最大
  5. 基础批量插入、通用索引、CASE 条件判断、基础替换截取函数全数据库通用
相关推荐
KaMeidebaby12 小时前
卡梅德生物技术快报|多肽库筛选:基于全质粒 PCR 的噬菌体文库构建与小分子表位淘选实战
前端·数据库·其他·百度·新浪微博
phltxy12 小时前
Redis 常见面试题
数据库·redis·缓存
IpdataCloud12 小时前
IP查询工具怎么选?在线API vs IP离线库:精度、速度、成本、隐私全对比
服务器·网络·数据库
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ12 小时前
MySQL选择字符集和排序规则
数据库·mysql
努力努力再努力wz12 小时前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
旺仔Sec12 小时前
HBase 分布式集群部署实战:从解压到启动的完整指南
数据库·分布式·hbase
Gauss松鼠会12 小时前
GaussDB(DWS) 资源监控Topsql
java·网络·数据库·算法·oracle·性能优化·gaussdb
小碗羊肉12 小时前
【Redis | 第二篇】Jedis&SpringDataRedis
数据库·redis·缓存
周易宅12 小时前
Docker MySQL 8.0.45 性能优化配置文档
mysql·docker·性能优化