本文是让有MySQL和SQL基础的用户掌握Oranle数据库的特性并快速上手而编写的
Oracle数据库
本文是让有MySQL和SQL基础的用户掌握Oranle数据库的特性并快速上手而编写的
一.基本特性
MySQL是一个开源的关系数据库管理系统,免费且易于使用,适合中小型企业和个人。Oracle则是一个对象关系数据库管理系统(ORDBMS),功能强大,适合大型企业,适合处理高并发、大数据量的复杂业务场景。但需要付费。
对象关系 数据库管理系统:基于对象模型,存储数据及其方法,数据存储在对象中。拥有对象类、对象标识、多态、封装和继承等特性。用于存储复杂的数据。
关系 数据库管理系统:基于关系模型, 只存储数据,数据存储在实体里面,以包含特定信息的表格的形式存在。用于处理比较简单的数据
| 标准 | RDBMS | ORDBMS |
|---|---|---|
| 缩写含义 | 关系数据库管理系统 | 面向对象数据库管理系统 |
| 数据存储方式 | 数据以表格形式存储,包含行和列 | 数据以对象形式存储 |
| 数据复杂性 | 适合处理简单的结构化数据 | 适合处理更大、更复杂的对象数据 |
| 分组 | 实体集合通过表定义,实体类型独立 | 通过类描述对象,包含属性、行为和关系 |
| 数据处理 | 仅存储数据,不存储方法或逻辑 | 存储数据及关联的方法(行为) |
| 主要目标 | 数据独立性(与应用逻辑分离) | 数据封装(数据与行为结合) |
| 主键/对象标识 | 主键(Primary Key)唯一标识表中的行 | 对象标识符(OID)唯一且持久标识对象 |
客户规模:Oracle主要面向大企业级级别的用户,而MySQL则更适合中小型企业和个人。根据Gartner的数据,截至2020年,Oracle占据了全球关系型数据库管理系统市场的超过40%的份额,而MySQL仅占5%。
可移植性和兼容性:MySQL可以很容易地在各种平台上运行,并与其他许多开源软件集成。Oracle虽然也有跨平台支持,但更偏向于使用自己的技术堆栈和产品集成。
安全性:Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。MySQL只使用三个参数来验证用户,即用户名,密码和位置。
内存:Oracle占有内存空间大(因为面对对象,并且还存储数据的方法);MySQL占有内存空间比较小
性能和扩展性:由于MySQL的精简设计和管理方式,所以其性能通常比Oracle更高,尤其在读取和写入方面。MySQL的扩展性也相对较好,因为其社区活跃,有许多插件和工具可供选择和使用。
支持并发量:Oracle支持大并发访问量,是OLTP(联机事务处理)最好的工具;MySQL并发小,面对大访问量可以做分表分库优化。
OLTP(联机事务处理):表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主,评估其系统的时候,一般看其每秒执行的Transaction以及Execute SQL的数量。典型的OLTP系统有电子商务系统、银行、证券等。
存储内容:与Oracle相比,MySQL没有角色管理(MySQL8.0开始支持),快照,同义词和包以及自动存储管理。
表空间:
Oracle:
SYSTEM:存放系统表、视图、存储过程。所有的数据库结构和管理信息都保存在这里。 SYSAUX:SYSTEM 表空间的辅助空间,主要用于存储除数据字典外的其他数据对象,减少 SYSTEM 表空间的负荷 TEMP:用于存储临时数据,通常是排序和临时操作所需的数据。 UNDOTBS1:存放撤销数据,用于回滚事务和提供一致性读操作。 USERS:存放应用系统使用的数据对象,是默认用户表空间。 EXAMPLE:存储数据库的示例数据,通常是 Oracle 安装时选择"示例方案"时所用的数据。1
2
3
4
5
6
7
MySQL:
- ```
MySQL5.6之前,只有共享表空间(所有数据存储在一个 .ibdata 文件中)。
5.6开始,支持独立表空间(每个表单独的 .ibd 文件)和共享表空间(存储系统数据库和表,初始12MB,会自动扩容)。
可移植性和兼容性:MySQL可以很容易地在各种平台上运行,并与其他许多开源软件集成。Oracle虽然也有跨平台支持,但更偏向于使用自己的技术堆栈和产品集成。
临时表特点:Oracle临时表默认所有会话内可见,一旦创建就会存在,直到显式删除。可以设置临时表仅在当前会话内或事务内可见。MySQL临时表只在当前会话可见,一旦会话关闭,临时表会自动删除。
二.基本操作
端口和管理员
Oracle默认端口:1521 默认用户:system
MySQL默认端口:3306 默认用户:root
登录
MySQL:
1 | mysql -u root -p |
Oracle:
1 | sqlplus |
Oracle 登录需要授予登录用户 CREATE SESSION 权限,这意味着用户需要被授权创建数据库会话的权限才能成功登录。建表需要分配限额,指的是用户需要在其所属的表空间中拥有足够的存储空间配额才能创建新的表。如果没有足够的配额,即使拥有 CREATE TABLE 权限,也无法成功创建表。
修改密码
在管理员权限下修改普通用户密码
MySQL:
1 | set password for 用户名@localhost = password('新密码') |
Oracle:
1 | ALTER USER 用户名 IDENTIFIED BY 新密码; |
修改管理员用户密码
1.找到Oracle安装路径,访问database文件夹:
2.删除PWDorcl.ora
3.修改密码:
1 | orapwd file=~\database\pwdPWDorcl.ora password=new_password |
Oracle解锁账号
Oracle 在多次输错密码的情况下,会锁定该账户,导致无法登录数据库。
查看被锁定的账号:
1 | SELECT username, account_status |
解锁账号:
1 | ALTER USER 用户名 ACCOUNT UNLOCK; |
恢复密码:
1 | ALTER USER 用户名 IDENTIFIED BY 新密码 ACCOUNT UNLOCK; |
示例:
1 | -- 解锁。用户名不用引号 |
内存优化
在Oracle 11g及之后的版本中,自动内存管理(Automatic Memory Management(AMM))默认是开启的
Oracle开启AMM后,会根据当前系统的内存情况动态地分配内存,直到达到指定的最大值。当系统需要更多内存时,AMM会自动减少内存使用量。
1 | ALTER SYSTEM SET MEMORY_TARGET=2GB,SCOPE=SPFILE; |
在Oracle 10g及其后续版本中,自动共享内存管理(Automatic Shared Memory Management(ASMM))是默认开启的
ASMM会自动检测当前系统的内存使用情况,并根据需求分配和释放共享内存区域。
与AMM不同,ASMM只处理共享池、缓冲区高速缓存、Java池和辅助预留区的共享内存。
1 | ALTER SYSTEM SET SGA_TARGET=1024M; |
Oracle创建表空间
创建表空间
1 | create tablespace 表空间名称 logging datafile '路径\名称.dbf' size 2000m autoextend on next 500m maxsize 30720m extent management local; |
autoextend on: 这启用了数据文件的自动扩展功能。当表空间已满时,数据文件将自动增加大小。next 500m: 这指定了每次自动扩展时数据文件增加的大小为 500 MB。maxsize 30720m: 这设置了数据文件的最大大小为 30720 MB (30GB)。数据文件不会超过这个大小自动扩展。extent management local: 这指定了表空间使用本地管理的区段。这意味着表空间的区段分配信息存储在表空间本身的数据文件中,而不是存储在数据字典中。这通常是推荐的做法,因为它能提高性能并减少争用。
创建用户:
1 | create user 用户名 identified by 密码 default tablespace 表空间名; |
修改用户默认表空间:
1 | alter user 用户名 default tablespace 表空间名 |
书写习惯
关键字(例如 SELECT、FROM、WHERE 等)不区分大小写,如果你在双引号内定义的对象(如表名、列名),则会大小写敏感
1 | CREATE TABLE "TableName"("id" number); // 如果创建表的时候是这样写的,那么就必须严格区分大小写 |
MySQL:大小写不敏感
基础数据类型
| 类别 | 类型 | 描述 | 示例 |
|---|---|---|---|
| 数值类型 | NUMBER(p, s) |
高精度数值,p为总位数,s为小数位数。若不指定,可存储任意精度。 |
NUMBER(10,2) → 12345678.90 |
BINARY_FLOAT |
32位单精度浮点数(IEEE 754) | 科学计算、高速近似计算 | |
BINARY_DOUBLE |
64位双精度浮点数(IEEE 754) | 同上,更高精度 | |
| 字符类型 | CHAR(n) |
定长字符串,不足补空格,最大2000字节。 | CHAR(10) → ‘ABC ‘ |
VARCHAR2(n) |
变长字符串,最大4000字节(推荐替代VARCHAR)。 |
VARCHAR2(100) → ‘Hello’ |
|
NCHAR(n) |
定长Unicode字符串(按字符计算长度)。 | NCHAR(10) → ‘中文 ‘ |
|
NVARCHAR2(n) |
变长Unicode字符串(按字符计算长度)。 | NVARCHAR2(100) → ‘こんにちは’ |
|
CLOB |
大文本数据(最大128TB)。 | 存储长文章、XML/JSON文本 | |
NCLOB |
Unicode大文本数据。 | 多语言文本存储 | |
| 日期时间 | DATE |
日期+时间(精确到秒),格式为YYYY-MM-DD HH24:MI:SS。 |
DATE '2023-10-01' |
TIMESTAMP(p) |
时间戳,p为小数秒精度(0-9)。 |
TIMESTAMP(6) → 精确到微秒 |
|
TIMESTAMP WITH TIME ZONE |
带时区的时间戳。 | 跨时区应用 | |
INTERVAL YEAR TO MONTH |
存储年月间隔。 | INTERVAL '2-6' YEAR TO MONTH |
|
INTERVAL DAY TO SECOND |
存储日时间隔(可含小数秒)。 | INTERVAL '10 03:30:00' DAY TO SECOND |
|
| 二进制类型 | BLOB |
二进制大对象(最大128TB)。 | 存储图片、PDF文件 |
BFILE |
指向外部文件的二进制指针(文件存储在操作系统)。 | 外部文件引用 | |
RAW(n) |
原始二进制数据(最大2000字节)。 | 加密数据、哈希值 | |
LONG RAW |
遗留类型(不推荐),最大2GB二进制数据(用BLOB替代)。 |
特殊与扩展类型
| 类型 | 描述 | 适用场景 |
|---|---|---|
ROWID |
物理行地址(18字符字符串),唯一标识一行。 | 快速访问特定行 |
UROWID |
通用行标识(支持逻辑和物理ROWID)。 | 分布式数据库 |
XMLType |
存储和操作XML数据。 | XML文档存储、XPath查询 |
JSON (12c+) |
原生JSON支持(需Oracle 12c及以上版本)。 | REST API数据存储 |
SDO_GEOMETRY |
空间数据类型(需Oracle Spatial扩展)。 | GIS地理信息系统 |
ANYDATA/ANYDATASET |
存储任意类型的数据(动态类型)。 | 异构数据集成 |
运算
集合运算
1 | intersect --交集 |
数据类型间相互转换
1 | --转换日期型 |
DQL
和sql通用语句基本一致
注意:在oracle中没有mysql中的limit,当我们需要找某列的最大值或者最小值我们需要借助函数实现。
连接查询的oracle写法[oracle独有]
1 | --内连接 |
伪列(oracle独有)
1 | rownum --对某列进行排序 |
删除重复行的rowid写法
1 | -- 删除张三Chinese科目的非最新数据(只保留rowid最大的)的一行 |
DML
数据操纵语言DML,该部分语言在执行完语句后需要添加commit语句进行提交的操作
函数
1.数字函数
nvl(目标字段,默认值) --判断目标字段里面是否为空,如果不为空,则取目标字段的值,如果为空,则赋一个默认值 abs(x) --返回绝对值 mod(x,y) --返回x除以y的余数 power(x,y) --返回x的y次方 ceil(x) --向上取整 floor(x) --向下取整 round(x,y) -- trunc(x,y) --y的界限为小数点...断x在第y后的数字,把y位之后的数字全干掉(全换成0)1
2
3
4
5
6
7
8
9
10
11
2.日期函数
- ```
add_months(d,n) --返回日期d加上n个月后的日期
last_day(d) --返回d所处月份的最后一天的日期
months_between(d1,d2) --返回两个日期之间相隔几个月
round(d[,fmt])
--对日期d按照不同维度(fmt:yyyy/mm/dd/day[星期]/q[季度]/w[当月第几周]/iw[今年第几周1]/ww[今年第几周2])来进行四舍五入
trunc(d[,fmt]) --对日期d按照不同维度(fmt)来截断,维度参照fmt
聚合函数
max() min() avg() sum() count()聚合函数名(目标字段)over(partition by...order by...desc/asc)1
2
3
4
5. 分析函数
a. 聚合类分析函数row_number()over() --不计算相同数据,排名依次往后。1234 rank()over() --计算想要的数据,相同的数据排名一样,并空出后继续排名。1224 dense_rank()over()--计算相同的数据,相同的数据排名一样,但是不空出后续排名。1223 order by 后面的字段就是排名的依据,所以它一定有 order by1
2
3
b. 排名类分析函数lag()over([partition by...]order by...) --向上位移 lead()over([partition by...]order by...) --向下位移1
2
3
c. 位移类分析函数nvl(目标字段,默认值) --判断目标字段是否为空,如果不为空,则取目标字段的值,如果为空,则赋默认值 nvl2(目标字段,默认值1,默认值2) --判断目标字段是否为空,如果不为空,则取默认值1,为空取默认值2 case when...then...else...end --对某一列数据进行判断,返回一列数据 decode(目标字段,值1,结果1,值2,结果2...,其他结果) --oracle独有。作用类似case...when exists(x) --判断x是否有数据返回,如果有则成立,没有则不成立。一般x为子查询结果 not exists(x) in() not in()1
2
3
6.判断函数
#exists和in可以相互转换
sign() —判断结果集,返回0,1,-1
1 |
|
plsql的数据类型参照sql,仅有三种:varchar2、number、date
条件判断
a. if…else…
1 | declare |
b. case…when…
1 | declare |
循环控制
a. loop
1 | declare |
b. while
1 | declare |
c. for
1 | declare |
四.SQL优化
1. 索引
1 | --创建索引 |
2. 表分区
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。
表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到一个或多个表空间,这样查询数据时,不至于每次都扫描整张表。
1 | 1、范围分区 |