(1) 对事务的提交
MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮
(2) 分页查询
MySQL是直接在SQL语句中写"select… from …where…limit x, y",有limit就可以实现分页;而Oracle则是需要用到伪列ROWNUM和嵌套查询
SELECT ROWNUM , dept.* FROM dept
SELECT * FROM
(
SELECT ROWNUM , dept.* FROM dept
WHERE ROWNUM < endNum
)
WHERE ROWNUM > startNum
计算起始位置和结束位置
startNum = (pageNo - 1) * pageSize endNum = (pageNo * pageSize) + 1
(3) 事务隔离级别
MySQL是read commited的隔离级别,而Oracle是repeatable read的隔离级别,同时二者都支持serializable串行化事务隔离级别,可以实现最高级别的
读一致性。每个session提交后其他session才能看到提交的更改。Oracle通过在undo表空间中构造多版本数据块来实现读一致性,每个session
查询时,如果对应的数据块发生变化,Oracle会在undo表空间中为这个session构造它查询时的旧的数据块
MySQL没有类似Oracle的构造多版本数据块的机制,只支持read commited的隔离级别。一个session读取数据时,其他session不能更改数据,但
可以在表最后插入数据。session更新数据时,要加上排它锁,其他session无法访问数据
(4) 对事务的支持
MySQL在innodb存储引擎的行级锁的情况下才可支持事务,而Oracle则完全支持事务
(5) 保存数据的持久性
MySQL是在数据库更新或者重启,则会丢失数据,Oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复
(6) 并发性
MySQL以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。
虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
Oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以Oracle对并
发性的支持要好很多。
(7) 逻辑备份
MySQL逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用,Oracle逻辑备份时不锁定数据,且备份的数据是一致
(8) 复制
MySQL:复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。
Oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理较复杂。
(9) 性能诊断
MySQL的诊断调优方法较少,主要有慢查询日志。
Oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等
(10)权限与安全
MySQL的用户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
Oracle的权限与安全概念比较传统,中规中矩。
(11)分区表和分区索引
MySQL的分区表还不太成熟稳定。
Oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
(12)管理工具
MySQL管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有一定复杂性。
Oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。
(13)最重要的区别
MySQL是轻量型数据库,并且免费,没有服务恢复数据。
Oracle是重量型数据库,收费,Oracle公司对Oracle数据库有任何服务。
(14)Oracle常用的数据类型
字符型:varchar2:可变长度的字符,最大长度4000bytes,即1<=n<=4000,VARCHAR2(10),表示占10个字节的字符串,当长度小于10字节时,不会自动补空格,占实际大小,大于则报错
数字类型: NUMBER(P,S):P为整数位+S小数位数.例如NUMBER(5,3),表示整数位数为2,小数位数为3的数字,如25.112
日期类型: data缺省格式为DD-MON-YY,timestamp同样,精确到纳秒 日–月--年
LOB类型: BLOB:二进制数据,最大长度4G. CLOB:字符数据,最大长度4G,一般音视频类就BLOB,文献就CLOB
(15)逻辑操作符
and or not
如果and和or混用,and的优先级高于or,所以尽量的使用括号来表明优先级
(16)集合操作符
UNION(联合) 返回两个查询选定不重复的行。( 删除重复的行 )
UNION ALL(联合所有) 合并两个查询选定的所有行,包括重复的行。
INTERSECT(交集) 只返回两个查询都有的行。
MINUS(减集) 在第一个查询结果中排除第二个查询结果中出现的行。 (第一 – 第二)
(17)Oracle的链接操作符
SELECT ('wwj' || 'hello') as str1 FROM dual
(18)Oracle常用的函数
字符串函数 (subsrt 和 replace 和 decode)
SELECT SUBSTR(ch, pos, length) as str1 FROM dual
pos代表等于0或1时,都是从第一位开始截取
length代表要截取的字符串的长度
如果pos填写为负数,为倒着截取
SELECT REPLACE(‘wwj’,‘j’,‘q’) as str1 FROM dual
将字符串中包含j的替换成q
decode(条件,值1,返回值1,值2,返回值2) 等同于 if elseif
数学函数
SELECT ROUND(n, int) as num1 FROM dual
int位置代表保留几位小数,并且四舍五入
SELECT TRUNC(n1, n2) as num1 FROM dual
n2代表保留几位小数,并不四舍五入
转换函数(tochar 和 todate)
SELECT to_char(SYSDATE,‘Day, HH12:MI:SS’) FROM dual; SELECT TO_CHAR(99,’$99.9999’) FROM dual;
SELECT to_date(‘2089-5-7 17:09:37’,‘yyyy-mm-dd HH24:MI:SS’) from dual
其它函数
nal(expr1,expr2)代表 oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。
比如:select ename,NVL(comm, -1) from emp; 如何comm没值,则取-1
(19)Oracle 中的序列 和 Oracle 中的查询
mysql数据中提供了数据库自增的选项,但是oracle中没有提供,只有利用序列实现主键自增的功能
sequence 就是序号,也可以说是序列
创建
CREATE SEQUENCE seq1
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
查看与操作序列信息
select * from user_sequences;
Select * from all_sequences;
使用序列名.CurrVal:返回 sequence的当前值
使用序列名.NextVal:增加sequence的值,然后返回 增加后sequence值
select seq1.currval from dual
重新初始化seq的序号(可以使用修改)
alter sequence seq1 increment by 1
删除seq drop sequence seq1