MySQL/postgreSQL与达梦(DM)SQL语言的一些区别
MySQL/postgreSQL与达梦(DM)的SQL语言区别
注:不同版本之间存在差异
1、官方SQL语言文档
2、时间类型转换的某些函数差异,
如mysql的convert(‘时间’,DATE) 达梦可以使用to_char/date_format(,%Y-%m-%d %H:%i:%s)
//mysql: convert(Date,DATE),date_format(Date,%Y-%m-%d %H:%i:%s) //达梦: to_char(Date,YYYY-MM-DD),to_char(Date,YYYY-MM-DD HH24:MI:SS),to_date(Date,YYYY-MM-DD HH24:MI:SS),date_format(Date,%Y-%m-%d %H:%i:%s) //人大金仓: to_date(Date,YYYY-MM-DD),to_char(Date,YYYY-MM-DD HH24:MI:SS)
3、group by 达梦只能拿到分组 的字段与聚合函数的字段,与postgreSQL相同
4、仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值 主键ID未设置成自增列 ,修改表
4、生成随机数
返回一个[0,1]之间的随机浮点数。n 为数值类型,为生成随机数的种子,当 n 省略时,系统自动生成随机数种子
//mysql、达梦 select floor(RAND()*(SELECT MAX(ID) FROM advertising)) //人大金仓 select floor(RANDOM()*(SELECT MAX(ID) FROM advertising))
参考:
5、达梦不支持使用一个以上的连接 (如:inner join)。
6、人大金仓数据库不支持使用!=、<> ,需要有明确的不等于某个数值,否则都返回空。
原因:ora_input_emptystr_isnull 参数位于data/kingbase.conf文件中,默认为true,既当输入的为空字符串’’时,是否转换为null。 解决:将ora_input_emptystr_isnull 改为off (1)法一:在data/kingbase.conf 将ora_input_emptystr_isnull 设置为false, 在Server/bin目录打开终端,然后sys_ctl restart -D data所在目录重启数据库。 (2)法二:在可视化工具中修改(兼容相关 或 其它选项)
7、达梦关键字
达梦数据库返回字段为关键字时一律返回大写(不论字段是否大小写同时存在),除非使用双引号“”,如 value,time,times,sum,max,min,avg,type,count,date,year,month,day,hour,online 等,如select sum(Date) as time from ..或select time from ..=>返回的time字段名为大写。
8、Data_sub函数
DATE_SUB(date,INTERVAL expr type) => DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
expr 在达梦中需要加单引号,建议使用到这类函数时数字加上单引号。
查询近30天的数据
Date_sub 适用于mysql/达梦查询近段时间内的数据
date_sub(curdate(), INTERVAL 30 DAY) <= DATE
PostgreSQL则用
DATE >= NOW() - INTERVAL 30 DAY
9、单双引号的差异
达梦数据库对于单引号双引号很敏感,加单引号代表数值,加双引号代表字段;但是在mysql中查询的字段不能直接加双引号,不然会直接将查询字段的值也按字段输出,如select “AlarmDate” from ..=>输出的值为[“AlarmDate”,“AlarmDate”],mysql中加双引号只能在取别名的时候加,如select AlarmDate as “alarm” from ..。
10、人大金仓id自增问题
人大金仓数据库没有ID自增,可在插入时含ID字段或添加自增函数 参考 :
11、空字符 — PostgreSQL 中类似于MySQL中IFNULL(d.ID,0)的替代==>COALESCE(d.ID,0) AS “HasBind”
当某个值为null时赋予某个值给该字段
MYSQL:IFNULL(expression,value) //如:ifnull(hasbind,0) as hasbind MSSQLServer:ISNULL(expression,value) Oracle:NVL(expression,value) postgreSQL: COALESCE(expression,value)
12、达梦数据库 update 时 自增列不能修改
13、update联表更新的差异
mysql/达梦:
update tableA,tableB set tableA.name=tableB.name where tableA.id=tableB.id
postgreSQL:
update tableA set tableA.name=tableB.name from tableB where tableA.id=tableB.id
如官方手册中提到:
