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.函数
- 系统时间:Oracle是SYSDATE MySQL是sysdate()
- 字符函数CONCAT:
Oracle有两种语法,第一种嵌套使用CONCAT(不建议), 第二种使用 || (这种方式简单)
select CONCAT(CONCAT('ab','cd'),'ef') FROM dual
select 'ab' || 'cd' || 'ef' || 'gh' FROM dual
Mysql:
select concat('ab','cd','ef')
- 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的表中没有自增功能