关系型数据库介绍和初识Oracle
Q:什么是关系型数据库?
【拓展】简述关系型数据库和非关系型数据库
关系型数据库(Relational DataBase Management System),简称 RDBMS。说起关系型数据库,我们脑海中会立即浮现出 Oracle、MySQL、SQLServer 等数据库,这些都是我们常用的关系型数据库。
关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
关系型数据库最大的特点就是在其关系这个词,它可以保存数据库中的各种关系。那么这个关系如何理解呢?我们就拿公司这个组织来讲吧。
在公司里,我们有部门、小组、员工这几个实体,而这几个实体之间都是有一定关系的。例如:一个部门能有多个小组,一个小组有多个员工,所以部门和小组之间的关系是N:N的关系。于此类似,小组与员工也是N:N的关系。
关系型数据库的发展历程
在1979年,Larry Ellison 使用汇编和C语言主导开发了第一个商用关系型数据库 Oracle。在此之后的接近16年内的时间,Oracle 数据库一路奔跑,成为了世界上最流行的关系型数据库。
在1989年,微软(Microsoft)也发布了一个关系型数据库 SQL Server,但其同样也是一个收费的商业型数据库。
直到1995年,瑞典公司MySQL AB发布了 MySQL 数据库的第一个版本,从此终结了关系型数据库只能用 Oracle、SQL Server 这些收费软件的神话。
在 MySQL 诞生后,因为其开源、免费的特性,所以其得到了众多中小使用者的拥护,其用户量增长迅猛。而在这期间,MySQL的主人也几易其手。
在2008年,Sun 公司收购了 MySQL AB 公司,同时也获得了 MySQL 数据库的管理权。在 2010 年的时候,Oracle 公司收购了 Sun 公司,获得了 MySQL 的管理权。
而就在 Oracle 收购 Sun 公司的当天,因为担心被 Oracle 收购后MySQL的前景会受到限制,被称为 MySQL 之父的 Michael Widenius fork 了 MySQL 的一个分支,启动了 MariaDB 项目。
果不其然,在被收购不久后,MySQL随即推出了相关的收费版本。虽然原来的免费版本仍然可以使用,但在可预见的未来,Oracle 投入到 MySQL 中的精力可能很有限。毕竟Oracle是一个商业公司,也是要养家糊口的。
现在我们可以了解到现在主流关系型数据库的诞生和发展概况,主要可以分为下面几个阶段:
- 1979年,Oracle 数据库诞生;
- 1989年,SQL Server 数据库诞生;
- 1995年,MySQL 数据库诞生;
……
Q:你认为的关系型数据库的市场份额排名?
https://db-engines.com/en/ranking
Q:为什么使用Oracle?
MySQL这么好,为什么还有人用Oracle?
为什么大部分公司的数据库系统仍然要用Oracle?我认为Oracle之所以能占有这么大的市场份额,是因为其在海量数据的处理上更具有优势,并且能提供一整套的数据存储解决方案。
在一些非常大的企业里,这些企业通常拥有庞大的资金能力,所以它们会选择用钱购买解决方案,而不是自己雇佣人员使用 MySQL 去维护(当然现在也有很多大厂倾向去Oracle而使用MySQL)。
总的来说,Oracle比起MySQL具有下面的优点:
- 众多的数据库特性,能满足企业的多样性需求;
- 海量数据处理的优势,性能高(保持开放平台下TPC-D和TPC-C世界记录);
- 一整套数据解决方案;
-
更加安全(最高认证级别的ISO标准认证)
……
因为Oracle有上面这些特性,所以Oracle更加适合那些大型企业。因为这些企业资金充足,能承担得起Oracle的昂贵费用。另一方面,这些企业的数据量也是非常庞大,它们更注重数据的安全性和高效存储,并且关心的出现问题的时候能快速解决,Oracle提供的一系列服务正好符合它们的需求。在国内,金融机构、政府部门、银行、医院等机构常选择使用Oracle。
而对于一些中小型企业或者个人使用者来说,一方面Oracle软件非常笨重,另一方面Oracle授权费用昂贵,对于它们来说无法承受。而它们的数据库又恰好不是特别大,所以对于这些使用者来说,使用MySQL已经能够解决它们的需求了。那么也就无需去付费使用Oracle的数据库了。如果单纯从(关系型)数据库性能来进行比较的话,Oracle无疑是最牛逼的,毕竟Oracle比MySQL诞生早了10多年,历史地位在这里摆着呢,所以学习掌握Oracle是很有必要的。
Oracle常用的数据库字段类型如下:
字段类型 | 中文说明 | 限制条件 | 其他说明 |
---|---|---|---|
CHAR | 固定长度字符串 | 最大长度2000 bytes | |
VARCHAR2 | 可变长度的字符串 | 最大长度4000 bytes | 可做索引的最大长度749 |
NCHAR | 根据字符集而定的固定长度字符串 | 最大长度2000 bytes | |
NVARCHAR2 | 根据字符集而定的可变长度字符串 | 最大长度4000 bytes | |
DATE | 日期(日-月-年) | DD-MM-YY(HH-MM-SS) | 无千虫问题 |
TIMESTAMP | 时间戳 | 可存储时区和秒的小数位 | 0-9位小数,默认是6位 |
LONG | 超长字符串 | 最大长度2G(231-1) | |
RAW | 固定长度的二进制数据 | 最大长度2000 bytes | 可存放多媒体图象声音等 |
LONG RAW | 可变长度的二进制数据 | 最大长度2G | 同上 |
BLOB | 二进制数据 | 最大长度4G | |
CLOB | 字符数据 | 最大长度4G | |
NCLOB | 根据字符集而定的字符数据 | 最大长度4G | |
BFILE | 存放在数据库外的二进制数据 | 最大长度4G | |
ROWID | 数据表中记录的唯一行号 | 10 bytes | ********.****.****格式,*为0或1 |
NROWID | 二进制数据表中记录的唯一行号 | 最大长度4000 bytes | |
NUMBER(P,S) | 数字类型 P为总位数,S为小数位数 | ||
DECIMAL(P,S) | 数字类型 P为总位数,S为小数位数 | ||
INTEGER | 整数类型 | 小的整数 | |
FLOAT | 浮点数类型 | NUMBER(38),双精度 | |
REAL | 实数类型 | NUMBER(63),精度更高 |
补充:varchar和varchar2区别
- varchar是标准sql里面的。 varchar2是Oracle提供的独有的数据类型;
- varchar对于汉字占两个字节,对于英文是一个字节,占的内存小;varchar2当字符集为UTF-8时,一个中文占三个字节,当字符集为ZHS16GBK时,一个中文占两个字节;
- varchar对空串不处理,varchar2将空串当做null来处理;
- varchar存放固定长度的字符串,最大长度是2000,varchar2是存放可变长度的字符串,最大长度是4000;
- 如果是要跟换不同的数据库,例如mysql,那么就用varchar,如果就用oracle,那么用varchar2比较好一点。
- MySQL查询语句中可以没有from,Oracle 必须有;
eg:MySQL查询当前时间:SELECT NOW();
Oracle查询当前时间:SELECT SYSDATE FROM DUAL;
- MySQL使用单引号和双引号表示字符,Oracle只能使用单引号(sql标准中也是使用单引号表示字符);
- MySQL分页使用
limit offset
,Oracle分页得借助rownum
关键字; - MySQL自动增长auto_increment,Oracle使用序列代替;
- MySQL 和Oracle
group by
语法不同;
……
其他资料:
Oracle和MySQL的函数对比和常用区别
Oracle 高效分页查询SQL
Oracle数据库查询高效分页
TODO 处理海量数据Oracle和MySQL的性能比较?