Oracle与MySQL的区别

1.字段类型(数值型)

Oracle:

Oracle中的数值型只有number类型,最大长度是38位,不管是整形还是浮点型都是使用number类型,例如

NUMBER(5) 最大可以存的数为 99999

NUMBER(5,2) 最大可以存的数为 999.99

MySQL:

MySQL中整型 int  int unsigned  bigint  bigint unsigned integer

浮点型decimal  float  double

2.事务

Oracle默认不自动提交事务,MySQL默认自动提交事务。所以Oracle在PL/SQL图形化界面操作数据库表时需要手动提交事务

3.分页

Oracle数据库有伪列ROWID和ROWNUM,有伪表dual ,MySQL数据库没有

ROWNUM可以用于分页操作,而MySQL的分页是用limit

Oracle:

简单分页操作

显示前 10 条记录

select t.* from T_ACCOUNT t where rownum<=10

显示前 第10到第20 条记录

select t.* from T_ACCOUNT t where rownum>10 and rownum<=20

rownum 是在查询语句扫描每条记录时产生的,所以不能使用“大于”

符号,只能使用“小于”或“小于等于” ,只用“等于”也不行,可以使用子查询来实现

SELECT * FROM 

(SELECT rownum r,t.* FROM T_ACCOUNT t WHERErownum<=20)

WHEREr>10

基于排序的分页

嵌套三层,让结果先排序,然后对排序后的结果再产生 R

SELECT * FROM 

(SELECT rownum r,t.* FROM 

(SELECT * FROM  T_ACCOUNT ORDER BY usenum DESC) t

WHERE rownum<=20 )

WHERE r>10

基于分析函数的分页

SELECT * FROM 

(SELECT ROW_NUMBER() over(ORDER BY USENUM DESC) rownumber, ta.* FROM T_ACCOUNT ta)

WHERE rownumber <=20 AND rownumber>10

基于差集的分页

SELECT rownum, ta.* FROM T_ACCOUNT ta WHERE rownum<=20

MINUS 

SELECT rownum, ta.* FROM T_ACCOUNT ta WHERE rownum<=10

MySQL:

MySQL的分页公式:

起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数

LIMIT 起始索引, 每页显示记录数

select * from emp limit 0,10;

select * from emp limit 10,10;

4. 伪表伪列

Oracle数据库有伪表dual,伪列ROWID(物理地址),ROWNUM (序号)以及序列中的nextval(提取下一个值)、currval(提取当前值

Oracle的select 后必须根from + 表, 而MySQL可以没有,例如

Oracle: select SYSDATE FROM dual

MySQL: select sysdate()

5.函数
  1. 系统时间:Oracle是SYSDATE MySQL是sysdate()   
  2. 字符函数CONCAT:

Oracle有两种语法,第一种嵌套使用CONCAT(不建议), 第二种使用 || (这种方式简单)

select CONCAT(CONCAT('ab','cd'),'ef')  FROM dual

select 'ab' || 'cd' || 'ef' || 'gh' FROM dual

Mysql:

select concat('ab','cd','ef')

  1.      3. decode函数(条件取值)

Oracle提供了封装sql1999标准的case  xxx  when (条件) then(处理)else(默认条件) end

的decode函数,在MySQL中是没有

表数据如下

select t.NAME, DECODE(t.OWNERTYPEID,1,'居民',2,'行政事业单位',3,'商业') AS 类型 FROM T_OWNERS t order BY id

相当于case条件取值的:

select name ,(case ownertypeid

when 1 then '居民'

when 2 then '行政事业单位'

when 3 then '商业'

else '其它'

end

) from T_OWNERS

或者更加灵活的写法(when的条件任意)

select name,(case

when ownertypeid= 1 then '居民'

when addressid = 5 then '其他'

when ownertypeid= 3 then '商业'

end from T_OWNERS

注意when then else end 中else使用的妙处:

需求:按月份统计 2012 年各个地区的水费

Else 0 是说统计非本月时返回数字0与之求和,不会影响总数

select ta2.NAME AS 区域 ,

SUM(CASE WHEN "MONTH" = '01' THEN MONEY ELSE 0 END) 一月,

SUM(CASE WHEN "MONTH" = '02' THEN MONEY ELSE 0 END) 二月,

SUM(CASE WHEN "MONTH" = '03' THEN MONEY ELSE 0 END) 三月,

SUM(CASE WHEN "MONTH" = '04' THEN MONEY ELSE 0 END) 四月,

SUM(CASE WHEN "MONTH" = '05' THEN MONEY ELSE 0 END) 五月,

SUM(CASE WHEN "MONTH" = '06' THEN MONEY ELSE 0 END) 六月,

SUM(CASE WHEN "MONTH" = '07' THEN MONEY ELSE 0 END) 七月,

SUM(CASE WHEN "MONTH" = '08' THEN MONEY ELSE 0 END) 八月,

SUM(CASE WHEN "MONTH" = '09' THEN MONEY ELSE 0 END) 九月,

SUM(CASE WHEN "MONTH" = '10' THEN MONEY ELSE 0 END) 十月,

SUM(CASE WHEN "MONTH" = '11' THEN MONEY ELSE 0 END) 十一月,

SUM(CASE WHEN "MONTH" = '12' THEN MONEY ELSE 0 END) 十二月

FROM T_ACCOUNT ta

left join T_AREA ta2

ON ta.AREAID = ta2.ID

WHERE ta."YEAR" = '2012'

GROUP BY ta2.NAME

 

也可以使用decode函数:

select ta2.NAME AS 区域 ,

SUM(DECODE("MONTH",'01',MONEY,0)) 一月,

SUM(DECODE("MONTH",'02',MONEY,0)) 二月,

SUM(DECODE("MONTH",'03',MONEY,0)) 三月,

SUM(DECODE("MONTH",'04',MONEY,0)) 四月,

SUM(DECODE("MONTH",'05',MONEY,0)) 五月,

SUM(DECODE("MONTH",'06',MONEY,0)) 六月,

SUM(DECODE("MONTH",'07',MONEY,0)) 七月,

SUM(DECODE("MONTH",'08',MONEY,0)) 八月,

SUM(DECODE("MONTH",'09',MONEY,0)) 九月,

SUM(DECODE("MONTH",'10',MONEY,0)) 十月,

SUM(DECODE("MONTH",'11',MONEY,0)) 十一月,

SUM(DECODE("MONTH",'12',MONEY,0)) 十二月

FROM T_ACCOUNT ta

left join T_AREA ta2

ON ta.AREAID = ta2.ID

WHERE ta."YEAR" = '2012'

GROUP BY ta2.NAME

 6.自增(可以应用于主键)

Oracle:可以使用序列的nextval实现主键自增,序列是Oracle用于产生一系列唯一数字的数据库对象,不是表的一部分,区别与MySQL,Oracle的表中没有自增功能

create sequence 序列名称
select 序列名称.nextval from dual
MySQL:可以使用表自带的主键自增功能

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值