oracle003:oracle的十大逻辑概念

一,表空间
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查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值