一,表空间:
Oracle中提出的表空间是解决数据跨物理设备存在的一种概念
在MySQL中innodb引擎下创建的表数据都在同一个文件下放着,但是为了方便使用,我们创建了独立表空间,是一个文件。但是硬盘中的文件是有大小的,达到它那个最大设定的时候,数据就放不进去,我们又不能删库,所以没法解决。但是在oracle中,可以给一个文件默认大小的文件空间,如果它达到上限了,就自增,如果达到磁盘的上限,理论上也是没法解决的。但是oracle可以再换一个数据文件接着存放数据。可以是不同的磁盘,可以是U盘,可以是网络储存。。。
1,创建一个1M大小,名字是zllspace ,在d:zz.mdf
create tablespace zllspace datafile 'd:zz.mdf' size 1m autoextend on;
2,给zll用户追加自定义表空间
alter table zll move tablespace zllspace;
创建zss用户时指定表空间
create user zss identified by zss default tablespace 表空间名;
3,当上一个数据文件达到磁盘上限的时候,换一个数据文件。此时表空间只有1个,数据文件有多个
alter tablespace 表空间名 add datafile 'e:/文件名.mdf' size 10m autoextend on;
除此之外,系统还帮我们设置了几个表空间:
system表空间:存放系统用户,角色,方案这些系统数据
Sysaux表空间:存放的是系统的一些样例,例子!,比如系统中自带的表就是例子
User表空间:默认存放的是用户的数据,在oracle10g之间所有用户存在system表空间下,10g之后存在user表空间下
Temp表空间:排序,汇总,统计之后的数据存入临时表空间。就是一张不存在的表
Undo表空间:存放的是更新之前的数据,牵扯到commit和rallback的数据。添加数据后数据在undo表下,commit和rallback之后,数据就离开了undo表空间
二,角色:。角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。比如我们之前的man就是一个角色
三,用户:Oracle用户是用连接数据库和访问数据库对象的。(用户是用来连接数据库访问数据库)。比如MySQL是通过库,表存放数据的。而oracle是通过用户来存放数据
四,表分区:经常用于查询的字段。
把一个大表分成若干个小表的过程
作用:提高查询检索的速度
一般我们查询的时候,都是一条一条的扫描,符合条件的拿出来,不符合条件的不拿出来,表分区就是为了更快的查询,在数据存入的时候按照特征把他们放到不同的区域,查的时候直接去某个区域找,这样更加方便,快捷。
1,范围分区(range)
按照范围分,比如0-10,10-20,20-30。。。
按ed进入文件编译,然后保存退出,按/执行。
create table student(
2 sid int primary key,
3 sname varchar(20),
4 sage int,
5 ssex varchar(20)
6 )
7 partition by range(sage)
8 (
9 partition p1 values less than sage(18)
10 partition p2 values less than sage(28)
11 partition p3 values less than sage(38)
12 partition p4 values less than sage(48)
13* )
select * from student partition (p1);
2,条件分区(list)
create table userinfo(
2 id int primary key,
3 uname varchar(20),
4 address varchar(20)
5 )
6 partition by list(address)
7 (
8 partition east values('芝加哥'),
9 partition west values('旧金山'),
10 partition south values('洛杉矶'),
11 partition north values('休斯顿')
12* )
3,散列分区(hash)
create table vip(
2 vid int primary key,
3 vname varchar(20)
4 )
5 partition by hash(vname)
6* partitions 4
4,复合分区(就是把上面3个合起来)
1 create table vip1(
2 vid int primary key,
3 vname varchar(20),
4 vage int
5 )
6 partition by range(vage)
7 subpartition by hash(vname)
8 subpartitions 5
9 (
10 partition p1 values less than (18),
11 partition p2 values less than (28),
12 partition p3 values less than (38)
13* )
五,伪劣:
- 伪劣就是假劣,不真实存在的列。
- rownum:行号,对结果集的每一行进行编号数据和行号不是一一对应的。只是对查出来的结果进行编号
比如查一个列的行号:rownum在一个结果集里面查,所以要把emp表里面的empon,ename,sal放到一个结果集a里面查。
select a.*,rownum from
(select empno,ename,sal from emp order by sal desc) a
1、rownum 对于等于某值的查询条件
如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
2、rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。
3、rownum对于小于某值的查询条件
如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。
由上面可知:
select a.*,rownum from
(select empno,ename,sal from emp order by sal desc) a
where rownum>=10
是不成立的,改成=10也不成立,改成<或者<=就可以成立。
- rownum的用法:用于分页,我们再MySQL中是用limit进行分页的,在oracle中用rownum进行分页:
select a.*,ss from
(select empno,ename,sal,rownum as ss from emp where rownum<=8)a
where ss>=3
它虽然查不了>=但是可以把<=查出来作为一个结果集,让结果集>=。
- Rowid:存储的是数据所在的段,区,块的物理位置(相当于java里面的地址)
- rowid和数据是一一对应的,相当于每个数据都有自己独有的存放地址。
查看rowid:
select a.*,rowid from(select empno,ename,sal from emp)a
六,同义词:
给用户底下的数据访问的时候起别名,比如一般我们访问的时候要根据方案去访问。zll.users。但是如果起了别名,可以按照别名访问。
这是私有同义词,谁创建谁用,SYS创建的,只能他自己用,其他用户用不了
create synonym users for zll.users;
创建共有同义词,一旦创建,其他用户都可以用。
create public synonym zll for zll.users;
七,index索引
Oracle默认采用的就是b*数索引
- 作用:提供一种快速检索数据的方式,减少跟磁盘io’的读写,提高运行速度
1,我们看下传统索引的储存方式:
传统索引存储(线性结构存储,按顺序结构存储)不适用与经常添加,删除,修改的数据表
索引表更新是系统自动维护的,虽然我们感觉不到它有多慢,但是操作数据频繁的话是真的慢。
如上图:比如我们查的是小于20岁的人,如果没有索引,它将是一个一个比较,查出符合条件的。但是加了传统索引之后,索引加到了年龄上,如果相查小于20岁的,那就只查到小于20的序列,大于20的序列将不会再查,这样大大提高了效率。但是增删改的时候,动了里面的数据,又要重新排序,所以就麻烦一点了。
2,B*树索引(适用于高基数的列上,比如身份证号,学号,等等,就是树越茂盛越好)
创建索引:
Create index 索引名 on 哪个表(哪个列)
创建和obj一样的a表
Create table a as select * from obj;
- 你如何知道你的索引加上了?
使用查看数据库执行计划
set autotrace on
打开执行计划一目了然
3,位图索引:使用与低基数的列上(性别,住址,籍贯,血型)
使用的是bit数据,bit集合实现的一种索引方式
Create bitmap index 索引名 on 哪个表(哪个列)
八,段区块:
Oracle的逻辑结构由小到大是:数据块,区,段,数据文件,表空间;
oracle的物理结构是文件,包括数据文件,日志文件等;
数据块是数据库的中的最小的单位,区是分配空间的最小单位,段是对象,有一个个区组成。
九,主键自增(序列):
mysql中的自增效率太低,原因是一条增加语句引发三条sql语句,先查最大值,再改最大值,再返回最大值去使用。
- 在oracle中没有主键自增,但是主键自增就是序列
- 序列自增的原理:定义两个变量 a1 a2
当第一次插入数据时,将数据库里的最大值直接改成20存入a1变量中
A2中存放的是1,以后插入数据将a2++,判断有没有小于等于a1,当a2==a1时,再将a1改为40,这样插入20条数据,才跟数据库交互一次,这样大大提高运行效率
创建序列:
Create sequence 序列名(seq_a);
添加数据的时候给序列:
Insert into stu values(seq_a.nextval,’zs’);
创建一个序列为20的序列号:
create sequence seq_x cache 20
创建一个从10开始,每次增加2的序列:
create sequence seq_x start with 10 increment by 2
创建一个0-5循环的序列:
create sequence seq_x maxvalue 5 cycle nocache
十,方案:针对每一张表的访问都必须指明是哪个用户所拥有的表对象。比如上一篇中的zll.users
SGA:系统全局区(oracle占内存)
系统会开辟一定的内存来存储oracle启动索要 加载的数据
数据缓冲区:
存放的是你使用过的数据或者是查询的结果就放入数据缓冲区(缓存)
日志缓冲区:
日志文件:存放事物每一刻的状态,如果你的数据发生灾难,通过日志文件可以进行恢复,一般日志文件最少得有2个
首先我们的所有日志数据不是直接存入日志文件,而是先存入日志缓冲区,目的还是提高运行速度
Sql共享池:
存放的就是所有sql语句运行完的结果放入sql共享池,以便其他用户使用
数据字典:
存放的是用户,角色,权限,方案等信息,每次用户进行操作时就是直接去数据字典缓冲区里取数据,提高运行速度
视图:
- 也是一张表,是一张虚拟的表,是存放查询结果的一张表
1,隔离级别:
1,给emp表的empno,ename创建一个叫zll的视图。
create view zll as select empno,ename from emp;
2,创建新用户wpp,密码wpp
create user wpp identified by wpp;
3,给用户wpp登陆的权限
grant create session to wpp;
4,查看视图
注意:操作视图就是操作基表
有两种特殊情况不能操作视图
1:order by avg sum max 等聚合函数之后的结果存入视图后是不能更改视图的
2;只读视图也不能更改
创建只读视图:创建了一个叫sqq的只读视图。
create view sqq as select * from dept with read only;
2,适用于复杂的sql查询