整理了MySQL语法改DM语法常见问题及改写方法。
MySQL语法:
select * from `test`;
DM语法:
select * from "test";
解析:
DM用双引号引用数据库对象(如表名、列名等)或者关键字
MySQL语法:
select 'abcde';
或者
select "abcde"
DM语法:
select 'abcde'
解析:
DM字符串引用符号为单引号
MySQL语法:
select a.age,(@ageSum := @ageSum + age) as ageSum
from (select * from test order by age desc ) a,(select @ageSum :=0)c
输出样例:
DM语法:
SELECT age,SUM(age) OVER (ORDER BY age desc) as ageSum
from test;
解析:
DM通过OVER (ORDER BY age desc) 可实现逐行累加
MySQL语法:
select a.age,(@rounum := @rounum + 1) as rounum
from (select * from test order by age desc ) a,(select @rounum :=0)c
输出样例:
DM语法:
select a.age,rank() over(order by age desc)
from (select * from test order by age desc) a
或者
select a.age,ROW_NUMBER() over(order by age desc)
from (select * from test order by age desc) a
解析:
通过 rank() over(order by age desc) 或者 ROW_NUMBER() over(order by age desc) 打印行号(mysql 8.x 同样支持这种语法)
MySQL语法:
insert into
from test(id,name,age)
values(1,'123',123)
on duplicate key update id = '1';
DM语法:
merge into test t1
using(
select 1 as id,'123' as name,123 as age
from dual
)t2 on (t1.id = t2.id)
when not matched then insert(id,name,age)values(t2.id,t2.name,t2.age)
when matched then update set t1.name=t2.name,t1.age=t2.age;
解析:
DM用merge into 实现upsert
GROUP_CONCAT()
MySQL语法:
SELECT age,GROUP_CONCAT(name order by id desc separator '、') AS concat_name
FROM test
GROUP BY age;
样例:
DM语法:
select age,LISTAGG(name,'、') WITHIN GROUP(ORDER BY id desc) AS concat_name
from test
group by age
MySQL语法:
SELECT STR_TO_DATE('2021-08-10', '%Y-%m-%d') AS date_value;
DM语法:
SELECT TO_DATE('2021-08-10', 'YYYY-MM-DD') AS date_value
Mysql语法:
select count(DISTINCT age,IF(name='2312',TRUE,NULL))
from test;
样例:
DM语法:
select count(DISTINCT DECODE( name,'2312', age,NULL))
from test
MySQL语法:
SELECT DATEDIFF('2023-08-10', '2023-07-01') AS day_diff;
语法:select DATEDIFF(d1,d2);
样例:
DM语法:
SELECT DATEDIFF(d, '2023-07-01','2023-08-10') AS day_diff;
语法:select DATEDIFF(datepart,d2,d1)
其中datepart取值如下图:
TPS:
MySQL 函数DATEDIFF(d1,d2) 和 DM 的 DATEDIFF(datepart,d2,d1)函数 日期顺序相反
MySQL 的CONCAT函数传入NULL值,返回是必为NULL;但是DM的CONCAT函数传入NULL值,NULL值会被处理为空字符串。
为了让DM的CONCAT跟MySQL的CONCAT达到相同效果,需要特殊处理:
MySQL语法:
select concat('%','123',null,'%')
DM语法:
SELECT NULLIF(concat('%',NULL,'%'), '%%')
MySQL语法:
select IF(name='xiaoming' or age=123,'asd',null) from test;
DM语法:
SELECT (CASE WHEN name = 'xiaoming' OR age = 123 THEN 'asd' ELSE NULL END) AS result
FROM test;
MySQL的DATE函数时可以将字符串、数字、时间戳转为date 类型数据。这里按入参类型分情况描述。
1.入参为数字或者字符串的改写方法:
MySQL语法:
SELECT date('2023-08-10');
SELECT date(20230810);
DM语法:
SELECT TO_DATE(20230810,'YYYYMMDD');
SELECT TO_DATE('2023-08-10','YYYY-MM-DD');
2.入参为时间戳timestamp改写方法:
MySQL语法:
SELECT date(CURRENT_TIMESTAMP)
DM语法:
SELECT TO_DATE(date_format(CURRENT_TIMESTAMP,'%Y-%m-%d'),'YYYY-MM-DD')
或者
SELECT TRUNC(CURRENT_TIMESTAMP)
MySQL语法:
SELECT STR_TO_DATE('2023-08-10','%Y-%m-%d');
DM语法:
SELECT TO_DATE('2023-08-10','YYYY-MM-DD');
MySQL语法:
select DATE_SUB(curdate(), INTERVAL 1 DAY)
select DATE_ADD(curdate(), INTERVAL 1 DAY)
SELECT DATE_SUB(curdate(), interval +1 month)
SELECT DATE_ADD(curdate(), interval -1 month)
SELECT DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY)
DM语法:
select DATE_SUB(curdate(), INTERVAL 1 DAY)
select DATE_ADD(curdate(), INTERVAL 1 DAY)
SELECT DATE_SUB(curdate(), interval +'1' month)
SELECT DATE_ADD(curdate(), interval -'1' month)
SELECT DATE_ADD(curdate() - day(curdate()) ,interval '1' day)
解析:
1.DM 使用DATE_SUB做日期加减时,差值必须用单引号括起来。
2.DATE_SUB()/DATE_ADD()的入参为 (日期,日期差值表达式) 。
表_字段注释
MySQL允许在建表上添加注释,也可以通过alter 语法添加注释;而达梦的注释是通过COMMENT语法实现的。
MySQL语法:
CREATE TABLE `test` (
`id` int DEFAULT NULL COMMENT 'id',
`name` varchar(50) DEFAULT NULL,
`age` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='test表';
或者
ALTER TABLE TEST MODIFY COLUMN id INT COMMENT 'id';
ALTER TABLE TEST COMMENT 'test表';
DM语法:
COMMENT ON TABLE TEST is 'test表';
COMMENT ON COLUMN TESTDB.TEST.ID IS 'id';
文章
阅读量
获赞