文章目录
本系列文章:
MySQL(一)SQL语法、数据类型、常用函数、事务
MySQL(二)MySQL SQL练习题
MySQL(三)视图、存储过程、索引
MySQL(四)存储引擎、锁
MySQL(五)MySQL架构、数据库优化、主从复制
MySQL(六)SQL语句优化
MySQL(七)MySQL和Oracle、PostgreSQL的区别
一、MySQL和Oracle
1.1 基本差别(是否收费/单表数据量/Oracle支持的并发量高)
- 数据库类型
Oracle数据库是一个对象关系数据库管理系统(ORDBMS),MySQL是一个开源的关系数据库管理系统(RDBMS)。
对象关系数据库管理系统:基于对象模型,存储数据及其方法,数据存储在对象中。拥有对象类、对象标识、多态、封装和继承等特性。用于存储复杂的数据。
关系数据库管理系统:基于关系模型, 只存储数据,数据存储在实体里面,以包含特定信息的表格的形式存在。用于处理比较简单的数据。
- 客户规模
Oracle主要面向大企业级别的用户,而MySQL则更适合中小型企业和个人。 - 成本
Oracle付费,MySQL免费。 - 可移植性和兼容性
MySQL可以很容易地在各种平台上运行,并与其他许多开源软件集成。Oracle虽然也有跨平台支持,但更偏向于使用自己的技术堆栈和产品集成。 - 安全性
Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。MySQL只使用三个参数来验证用户,即用户名,密码和位置。 - 内存
Oracle占有内存空间大(因为面对对象,并且还存储数据的方法);MySQL占有内存空间比较小。 - 性能和扩展性
由于MySQL的精简设计和管理方式,所以其性能通常比Oracle更高,尤其在读取和写入方面。MySQL的扩展性也相对较好,因为其社区活跃,有许多插件和工具可供选择和使用。 - 支持并发量
Oracle使用行级别的锁,不依赖索引来锁定某一行,锁资源的粒度小,所以并发性高,支持大并发访问量;
MySQL只有InnoDb支持行锁,而且必须依赖索引才能用到行锁,否则会使用表锁,所以并发性较低,面对大访问量可以做分表分库优化。 - 数据量
Oracle单表数据量,可以千万,甚至上亿的规模;Mysql单表数据量,最好控制在百万级别。 - 事务隔离级别
Oracle默认的是 read commited(读已提交)的隔离级别,会有不可重复读+幻读的问题。
MySQL默认是 repeatable read(可重复度)的隔离级别,只会有幻读的问题。 - 临时表
在MySQL中,临时表是仅对当前用户会话可见的数据库对象,并且一旦会话结束,这些表将自动删除。
Oracle中临时表的定义与MySQL略有不同,因为临时表一旦创建就会存在,直到它们被显式删除,并且对具有适当权限的所有会话都可见。但是,临时表中的数据仅对将数据插入表中的用户会话可见,并且数据可能在事务或用户会话期间持续存在。 - sql语句的灵活性
MySQL对sql语句有很多非常实用而方便的扩展,比如limit功能(分页)、insert可以一次插入多行数据;Oracle在这方面感觉更加稳重传统一些,Oracle的分页是通过伪列和子查询完成的,插入数据只能一行行的插入数据。 - 对于事务的支持
Mysql对于事务默认是不支持的,只是有某些存储引擎中如:innodb可以支持;而Oracle对于事物是完全支持的。
适合Oracle的场景:
对数据库有高级需求:如果企业对数据库的高级需求较高,如存储复杂数据及其方法,要求高可用性、灾备恢复、安全性等,可以考虑用Oracle。
大型企业应用:Oracle在处理大规模、复杂的企业级应用方面表现出色。它能够处理海量的数据和高并发的访问请求,同时支持复杂的数据模型和关系。
项目并发量高:使用Oracle,它是是OLTP(联机事务处理)最好的工具。
安全性要求高:Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。像金融、银行等对安全性要求高的项目一般都选用Oracle作为数据库。
高可用性和容灾需求:Oracle提供了强大的高可用性和容灾解决方案,例如集群配置、数据复制和自动故障转移等,能够确保系统的连续性和数据的可靠性。MySQL付费版也支持,但可靠性不如Oracle。
1.2 使用区别(大小写是否敏感/数值类型/)
- 1、大小写是否敏感
Oracle:双引号下大小写敏感,大小写不敏感的前提条件是在没有使用双引号 “” 的前提下(表名、字段名)。
Oracle创建表默认大写,可以设置为小写。
// 如果创建表的时候是这样写的,那么就必须严格区分大小写
CREATE TABLE "TableName"("id" number);
// 不仅要区分大小写而且要加双引号,以便和上面的第三种查询方式区分开
SELECT * FROM "TableName";
MySQL创建的表名默认小写。
- 2、常用字段类型
Oracle常用字段类型:
数值:number。
字符串:CHAR,NCHAR,VARCHAR2和NVARCHAR2。
char:使用数据库字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,自动补足空格。
nchar:使用国家字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,数据库自动补足空格。
varchar2: 使用数据库字符集存储数据,长度可变,如果存储数据没有达到指定长度,不自动补足空格。
nvarchar2:使用国家字符集来存储数据,长度可变,如果存储的数据没有达到指定长度,不自动补足空格。
日期:date、timestamp。
oracle的varchar,一般不使用,那个是sql标准的类型,允许空串,oracle自己开发了个类型叫varchar2,不允许存空串,而且可以兼容以后的oracle版本。
MySQL常用字段类型:
数值:tinyint、smallint、mediumint、int、bigint、decimal。
字符串:char、varchar。
日期:date、time、datetime、timestamp。
- 3、时间日期
Oracle对于计算前7天,时间减7就行了;计算前1个小时,时间减1/24就行了,加法同理:
select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') -7 from dual;
-- 计算前7天,结果:2021-05-23 15:51:20
select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') - 1/24 from dual;
-- 计算前1个小时,结果:2021-05-30 14:51:20
MySQL计算前7天,或者前1个小时,需要用不同的关键字:
select date_sub('2021-05-30 21:00:40' ,interval 7 day)
-- 计算前7天,结果:2021-05-23 21:00:40
select date_sub('2021-05-30 21:00:40' ,interval 1 hour)
-- 计算前1个小时,结果:2021-05-30 20:00:40
Oracle中timestamp类型的字段,相减,结果是多少天、多少小时,多少分钟,多少秒:
SELECT MIN_T, MAX_T, MAX_T - MIN_T
FROM "T_TIMESTAMP"
-- 结果:2021-07-06 20:29:20.000000 2021-07-07 20:29:22.000000 +000000001 00:00:02.000000
MySQL中,2个timestamp类型的值相减,如果想要知道相差多少天、多少秒,需要借助函数:
S