注册
MySQL语法改DM语法指南
技术分享/ 文章详情 /

MySQL语法改DM语法指南

夜未央丶 2023/08/11 3550 4 0

前言

整理了MySQL语法改DM语法常见问题及改写方法。

DML语法改写指南

关键字引用

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

输出样例:
image.png

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

输出样例:
image.png

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 同样支持这种语法)

upsert场景/on duplicate key场景

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

MySQL自带函数改写

GROUP_CONCAT()
MySQL语法:

SELECT age,GROUP_CONCAT(name order by id desc separator '、') AS concat_name
FROM test
GROUP BY age;

样例:
image.png

DM语法:

select age,LISTAGG(name,'、') WITHIN GROUP(ORDER BY id desc) AS concat_name
from test 
group by age

STR_TO_DATE()

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

count(DISTINCT ,IF())

Mysql语法:

select count(DISTINCT age,IF(name='2312',TRUE,NULL))
from test;

样例:
image.png
DM语法:

select count(DISTINCT DECODE( name,'2312', age,NULL))
from test

DATEDIFF()

MySQL语法:

SELECT DATEDIFF('2023-08-10', '2023-07-01') AS day_diff;
语法:select DATEDIFF(d1,d2);

样例:
image.png

DM语法:

SELECT DATEDIFF(d, '2023-07-01','2023-08-10') AS day_diff;
语法:select DATEDIFF(datepart,d2,d1)

其中datepart取值如下图:
image.png
TPS:
MySQL 函数DATEDIFF(d1,d2) 和 DM 的 DATEDIFF(datepart,d2,d1)函数 日期顺序相反

CONCAT()的NULL值处理

MySQL 的CONCAT函数传入NULL值,返回是必为NULL;但是DM的CONCAT函数传入NULL值,NULL值会被处理为空字符串。
为了让DM的CONCAT跟MySQL的CONCAT达到相同效果,需要特殊处理:

MySQL语法:

select concat('%','123',null,'%')

DM语法:

SELECT NULLIF(concat('%',NULL,'%'), '%%') 

IF()

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;

DATE()

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)

STR_TO_DATE()

MySQL语法:

SELECT STR_TO_DATE('2023-08-10','%Y-%m-%d');

DM语法:

SELECT TO_DATE('2023-08-10','YYYY-MM-DD');

DATE_SUB()/DATE_ADD() 日期加减

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()的入参为 (日期,日期差值表达式) 。

DDL语法改写指南

建表

表_字段注释
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';
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服