Oracle与MySQL语法区别总结

更新时间:2020年8月4日11:57:59

Mybatis

  • VARCHAR2 改成VARCHAR
  • mybatis中sql语句最后不能加分号 ,mysql解决方式在数据库url后添加allowMultiQueries=true;oracle尚未测试
  • 转义字符 :XML sql中不能直接使用大于小于符号,需要使用转义符替代
转义符实际表达
&lt;<小于
&gt;>大于

时间函数

参考:SQL Date 函数
https://www.w3school.com.cn/sql/sql_dates.asp

描述	MySQL	Oracle从日期或日期时间表达式中提取日期值	date(DATE)	to_char(DATE,'YYYY-MM-DD')按表达式 的要求显示日期	date_format(date,’%Y-%m-%d’)	to_char(TRADE_DATE,'YYYY-MM-DD')函数从日期减去指定的时间间隔	date_sub(date,interval 1 day)	trade_date-1计算起始日期 d 加上一个时间段后的日期	date_add(date,interval 1 day)	trade_date+1返回当前日期和时间	sysdate()	sysdate返回当前日期和时间	now()	sysdate返回两个日期之间的天数	DATEDIFF(date1,date2)	两个日期直接相减,便可以得到天数

注:1.mysql中date_format返回值是字符串,date返回值是日期;
2.Oracle中to_char返回值是字符串,trunc返回值是日期;
3.Oracle中日期与字符串无法直接比较,需要转换成相同类型。

Oracle

增减一小时sysdate±1/24
增减一天sysdate±1
增减一月add_months(sysdate, ±1)
增减一季度add_months(sysdate, ±3)
增减一年add_months(sysdate, ±12)

MySQL
date_sub: 对指定时间减少指定间隔
date_add: 对指定时间增加指定间隔

增减一小时date_sub(sysdate(), interval 1 hour)date_add(sysdate(), interval -1 hour)
增减一天date_sub(sysdate(), interval 1 day)date_sub(sysdate(), interval -1 day)
增减一月date_sub(sysdate(), interval 1 month)date_sub(sysdate(), interval -1 month)
增减一季度date_sub(sysdate(), interval 3 month)date_sub(sysdate(), interval -3 month)
增减一年date_sub(sysdate(), interval 1 year)date_sub(sysdate(), interval -1 year)

注:示例中均为减少操作

别名

Mysql中group by可以使用别名,Oracle 中不可以

select to_char(fatc.TRADE_DATE,‘YYYY-MM-DD’) AS tradeTime from FSBP_ACCEPTBIZ_TRADE_COLLECT fatc GROUP BY tradeTimeMYSQL中没有问题
select to_char(fatc.TRADE_DATE,‘YYYY-MM-DD’) AS tradeTime from FSBP_ACCEPTBIZ_TRADE_COLLECT fatc GROUP BY to_char(fatc.TRADE_DATE,'YYYY-MM-DD')Oracle中直接使用别名会报错
select * from (select to_char(fatc.TRADE_DATE,'YYYY-MM-DD') AS tradeTime from FSBP_ACCEPTBIZ_TRADE_COLLECT fatc ) GROUP BY tradeTime或者可以在Oracle中使用嵌套查询

聚合函数+分组

Oracle中出现在select列表中的字段或者出现在order by后面的字段,如果不是包含在分组函数中,那么该字段必须同时在group by子句中出现。
Mysql没有此限制。

参考:sql 聚合函数和group by 联合使用
https://www.cnblogs.com/panchanggui/p/10652852.html

select MER_CUST_NO,sum(TX_AMT) as TX_AMT,count(*) astx_total,PAY_TIME,STATUS from fsbp_pay_order_info whereSTATUS in ('01','11','12') group by mer_cust_noselect MER_CUST_NO,sum(TX_AMT) as TX_AMT,count(*) as tx_total fromfsbp_pay_order_info whereSTATUS in ('01','11','12') group by mer_cust_no

空值判断

MySQL中IFNULL函数在Oracle中可以使用NVL函数替代

MYSQL
IFNULL(v1,v2)如果v1的值不为NULL,则返回v1,否则返回v2。
NULLIF(expr1,expr2) 比较两个字符串,如果字符串expr1与expr2相等返回NULL,否则返回expr1
ORACLE
NULLIF(expression1,expression2) 如果两个表达式不相等,NULLIF返回第一个expression1的值。如果两个表达式相等,NULLIF返回空值NULL。
NVL(eExpression1,eExpression2) 如果eExpression1的计算结果为null值,则NVL()返回eExpression2。如果eExpression1的计算结果不是null值,则返回eExpression1。

NULL和空字符串

Oracle(null等同于空字符’’)
1.oracle插入空字符串默认替换成null
2.oracle查询(null和被替换的空字符)时使用 is null/is not null
3.使用聚合函数时自动忽略null值
Mysql(null不等同于空字符’’)
1.mysql插入null显示为null,插入空字符串显示空
2.null查询用 is null/is not null,空字符’‘查询用 =’’/<>’’
3.使用聚合函数时自动忽略null值

分页查询

MySQL关键字limit
Oracle:
在这里插入图片描述
①:普通分页,三层嵌套查询
②:需要有order by语句
③:只查询第一条数据时使用

模糊查询

MySQL中
concat(’%’,#{参数},’%’)
在Oracle中用
’%’||#{参数}||’%’
替代

转义符 `

` 是 MySQL 的转义符,避免和 mysql 的本身的关键字冲突
STATUS是MYSQL的关键字,在ORACLE中不是,直接去掉`

转义符示例

IF函数

在mysql中if()函数的用法类似于java中的三目表达式,其用处也比较多,具体语法如下:

IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。

在ORACLE中可以使用DECODE函数替代

IFupdate COMPARE_HISTORY_TGT a ,mod_rcl_compare_data_tgt b set a.COMPARE_STATUS = b.STATUS,a.QUESTION_TYPE = IF(b.STATUS=‘T’,‘02’,a.QUESTION_TYPE) where a.PAYCOMPANY_ORDER_SEQNO = b.ORG_SEQ
DECODEupdate COMPARE_HISTORY_TGT a ,mod_rcl_compare_data_tgt b set a.COMPARE_STATUS = b.STATUS,a.QUESTION_TYPE = DECODE(b.STATUS,‘T’,‘02’,a.QUESTION_TYPE) where a.PAYCOMPANY_ORDER_SEQNO = b.ORG_SEQ

时间函数

to_days

mysql中所用to_days进行两个日期的相差天数,
Oracle中可以参考使用trunc函数:
trunc(sysdate,'dd')-trunc(sysdate-2,'dd')

year、month、day、quarter

year年、month月、day日

MONTH函数返回一个整数,表示指定日期值的月份,其余同理。
在Oracle中:
参考:

SELECT extract(month from sysdate) FROM dual

SELECT to_char(sysdate,'MM') FROM dual

注(这种方式返回类型为字符串,如08,如需使用数字类型需要to_number(to_char(sysdate,'MM')))

quarter季度
select to_char(sysdate,'Q') from dual

1、//oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分

  • select extract(year from sysdate) from dual; --当前年
  • select extract(month from sysdate) from dual; --本年到当月的月数
  • select extract(day from sysdate) from dual; --本月到当日的天数
  • select extract(year from date’2011-05-17’) year from dual;
  • select extract(month from date’2011-05-17’) month from dual;
  • select extract(day from date’2011-05-17’) day from dual;

2、ORACLE里获取一个时间的年、季、月、周、日的函数

  • select to_char(sysdate, ‘yyyy’ ) from dual; --年
  • select to_char(sysdate, ‘MM’ ) from dual; --月
  • select to_char(sysdate, ‘dd’ ) from dual; --日
  • select to_char(sysdate,‘Q’) from dual; --季
  • select to_char(sysdate,‘iw’) from dual; --周–按日历上的那种,每年有52或者53周
  • 当前时间减去7分钟的时间
select   sysdate,sysdate - interval '7' MINUTE  from  dual; 
  • 当前时间减去7小时的时间
select   sysdate - interval '7' hour  from dual; 
  • 当前时间减去7天的时间
select   sysdate - interval '7' day  from dual; 
  • 当前时间减去7月的时间
select   sysdate,sysdate - interval '7' month  from dual; 
  • 当前时间减去7年的时间
select   sysdate,sysdate - interval '7' year  from dual; 
  • 时间间隔乘以一个数字
select   sysdate,sysdate - 8*interval '7' hour  from dual; 

AS关键字

在Oracle里,表的别名不能用as,列的别名可以用as

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值