Oracle是什么?
Oracle是一个关系数据模型数据库,对数据进行处理。
Oracle有什么用?
1.支持大数据库,多用户的高性能的事务处理
2.oracle遵守数据存取语言,操作系统,用户接口,和网络通信协议的工业标准
3.实施安全性控制和完整型控制:数据加密,数据校对,第三方认证服务
4.支持分布式数据库和分布式处理
5.完全向上兼容,具有可移植性(零移植风险)可兼容性和可连接性
6.全球化,跨平台的数据库
7.支持多平台,应用与平台无关
8.从双层模式到多层模式
Oracle怎么用?
oracle有哪些用处呢?
1.前序
这个时候用到的技术了
首先介绍开通一些必要的服务
比如监听器 服务器 等一些服务
oracle服务器
oracle数据库 oracle实例
后台进程和内存结构的集合
测试数据库是否连通
tnsping 主机字符串
数据文件‘’
*.ctl控制文件
*.log日志文件
*.ora参数文件
oracle运行流程
先启动oracle实例 ,使用sqlplus连接至数据库,创建用户进程,创建服务器进程然后提交sql查询
数据字典
什么是数据字典?
数据字典是一套记录,验证和提供数据库访问信息的只读表和视图
数据字典包括数据字典表和动态性能表
视图会随着1数据库的运行而不断的更新
动态性能表记录了数据库的活动
数据字典:
1.描述了数据库极其对象
2.包含两类对象
--基表 存储数据库的说明
--数据字典视图 基表信息的摘要
一些重要的表名信息
dba_talbes dba_tablespaces dba_data_files dba_indexes
如何使用oracle数据库呢?
首先要想使用oracle数据库他和mysql不同的是
mysql直接数据库,通过新建数据库
而oracle通过用户来操作数据库。多个用户对同一个数据库进行操作
每个用户有自己的表空间。
使用oracle数据库
首先创建表空间,再创建用户,在创建对象(表,索引,视图啊)
表空间
什么是表空间呢?
表空间就是一个或多个数据文件的逻辑集合
查询所有表空间
select distincet tablespace_name from dba_free_space;
如何创建表空间
create tablespace 表空间名 datafile '你想要存放的数据文件路径' size 20m autoextend off(不自动扩张,如果文件大小到了最大的时候是否变大)
删除表空间
drop tablespace 表空间名 including content and datafiles;(删除他的一切包括内容和数据文件)
用户
解锁
1.首先有些用户是锁住的所以要进行解锁 怎么解锁呢 在系统用户的工作环境下,点击你要解锁的那个用户,然后右键编辑进行解锁
2.通过sql代码进行解锁alter user 用户名 account unlock
忘记管理员密码
重写密码步骤
1.在sqlplus中修改
sqlplus/nolog
conn/as sysdba
alter user system identified by 你想要的密码
2.如果你想要修改其他的用户的密码的话
1.在系统用户的工作环境下进行修改,运行sql语句进行修改
2.也可以点击右键编辑进行修改
创建用户
create user 用户名;
密码可以进行修改或者点击右键直接创建对象
权限
oracle有着极其严格的权限管理制度,所以oracle是一个非常安全的数据库,做啥事都需要权限
怎么赋予一个用户权限呢
grant 权限 to 用户名 with admin-option(可以做任何操作,包括给其他用户权限);
怎么删除权限呢
revoke 权限 from 用户 any关键字表明有权限对于所有的模式
常用的数据类型
1.字符型
char 占用空间固定(1-2000个字节)
varchar() 占用空间可变化 1-4000个字节
varchar2() 占用空间可变化 1-4000个字节
使用哪种好呢?
要想向后兼容最好使用varchar2()
char和varchar()的区别?
char(20)存储‘abc’ 虽然只有3个字节但是他会有17个字节的空字符 ,他还是占用20个字节
varchar(20)存储‘abc’他会按照实际的情况来进行存储,之后向后延伸,多余的会继续存储
char()的效率比varchar()的效率高 因为char不同管他有多少个字节,而varchar则需要根据有多少字节,来知道有多少空间可以继续使用
varchar与varchar2的区别
工业标准的varchar类型可以存储空字符串,但是oracle不这样做,尽管他保留了工业标准的varchar但是他还床照了自己的字符型数据类型varchar2()他将varchar存储
空字符串的特性改为存储null值,所以要想向后兼容,使用varchar2()
如果发生行迁移现象,那么就用char代替varhcar2()会更好一些
什么是行迁移现象呢?
varchar2()列经常被修改,而且每次修改数据长度,会引起这个现象
2.数值型
number float
3.日期型
date
4.lob类型(存大对象的)
blob (纯二进制) clob(纯字符的)
sql语句的分类
ddl:数据定义语言
dml:数据操作语言
dcl:数据控制语言
Tranaction control 事务控制
ddl
增加字段
alter table 表名 add 字段名 字段的数据类型
修改字段的数据类型
alter table 表名 modify +字段+字段数据类型
删除字段
alter table 表名 drop column 字段名
修改字段名
alter table 表名 rename column 老的列名 to 新的列名
--修改表名
rename 老表名 to 新表名
添加注释
给表添加注释
comment on table 表名 is '你想要添加的注释';
给字段添加注释
comment on column 表名.字段名 is '你想要添加的注释';
查看数据字典
select * from user-tables
select * from user_tab_comments
select * from user_col_comments;
删除表
drop table 表名;但是他还是可以恢复的
怎么恢复表呢?
flashback table 表名 to before drop;
完全删除表
drop table 表名 purge(或者cascade constraints用于指定级联删除,从表的外键约束));
dml
同一个用户,不同的会话,dml操作会没有用
谈到dml就必须说一下事务
事务
什么是事务呢?
一条或多条dmlsql语句的集合 ,事务要么成功,要么失败,它可以一次提交或者回滚。如果失败了,那么数据将回到初始的状态。
对于oracle来说,所有的dml语句,需要手动提交,执行一条dml语句的时候,sql语句先是在缓存当中(回滚段),需要手动提交或回滚
commit到commit之间所有的sql我们成为一个事务
oracle不支持一次性插入多条记录
insert into 表名 (字段名) values(),(),();不支持
创建表的另一种方式
create table 表名 as select * from 其他表名 where 条件;如果有这条记录,那么表中也会有数据,否则只有表结构没有数据
增加
insert into 表名 (字段名) values();
特殊的插入方法
insert into 表名 (字段名) select * from 表名 --这张表的字段和数据类型要和那张表的数据类型一致
删除
delete from 表名 删除表数据,但是没有删除表结构,可以回滚数据,速度比较慢
truncate table 表名 删除表数据,但是没有删除表结构,不可以回滚书库,速度比较快
drop table 表名 删除表数据,也删除表结构,不可以回滚,速度很快
修改
可以修改多行
update 表名 set 字段=new 如果没有条件,那么所有的将会被修改
约束
什么是数据的完整性?
指:精确性和可靠性
防止不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的
数据的完整性是指存储在数据库中所有的数据均以正确的状态存储在数据库中
如果有不正确的数据值,则以丧失数据完整性
数据库采用多种方法来保证数据完整性,包括外键,约束,规则和触发器
约束是在表上强制执行的数据校验规则。
1.唯一约束unique
只能出现一次,不能又重复的
2.主键约束primary key
保证记录的唯一性唯一标识一条数据
3.外键约束 foreign key
表示表与表之间的关系 参照主键或者唯一键
4.check约束
sex varchar2(20) not null check (sex='男' or sex='女')
以上都是行级约束
还有表级约束
添加主键约束
constraints 键名 primary key (id);
添加外键约束
constraints 键名 foreign key (eid) references tb_clazz(id);
约束的维护
添加约束
alter table 表名 add constraints 约束名 primary key (id);
删除约束
alter table 表名 drop constraints 约束名
禁止约束
alter table 表名 disable constraints 约束名
激活约束
alter table 表名 enable constraints 约束名
复合约束
复合约束只能在表级中进行定义
约束是由多个字段组成的
数据建模
从数据库的表中删除冗余的数据信息称为规范化
规范化是得到高效的关系数据库的逻辑结构最好最容易的方法
执行操作:
1.将数据库的结构精简为最简单的模式
2.从表中删除冗余信息
3.标识所有的依赖与其他数据的数据
第一范式
必须有主键,并且每个属性值都是不可再分的最小数据单位
第二范式
联合主键
如果关系模式r中的所有非主属性都完全依赖与主关键字,则称关系r是属于第二范式的。
几个异常
数据冗余
插入异常
删除异常
cname cgreat 仅函数依赖与cno,也就是cname,cgreat部分依赖组合关键字(sno,cno)而不是完全依赖
解决方案:分成两个关系模式
第三范式
针对一个主键来讲
关系模式r中的非主关键字不能依赖于其他的非主关键字,即非主关键字之间不能有函数(传递)依赖关系
中间表
当多对多时,通过建立第三张表的形式来描述两个表的多对多关系
1主键
两个外键
2.eid cid为联合主键并且都分别为外键
一对一
1.外键关联(唯一)
其实就是一个外键只有一个外键来表示这个关系,给那个加上unique约束
2.主键关联
以主键作为外键
select语句
查询的时候可以使用运算符+-*/ 还有连接||
null值是不等于空字符串的
所有和null进行运算结果的都是null
清除重复记录
select * from emp; select * from dept; select empno, ename, job, mgr, hiredate,sal*12 as 年薪 , comm ,deptno from emp; --连接在一块 select dname||loc from dept; --是空 select * from emp where comm is null; --null 不等与‘’ select * from emp where comm =''; --去除重复 select distinct job,mgr,hiredate,sal,comm, deptno from emp; select distinct ename ,job from emp; --between and select * from emp where sal between 1100 and 3000; --in() select * from emp where deptno in(20,30); select * from emp where deptno=20 or deptno=30; --like 模糊查询 select * from emp where ename like '%A%'; select * from emp where ename like '_A%'; --not select * from emp where deptno not in(20,30); --优先级问题 and or 的优先级 select * from emp where ename='WAED'or mgr=7698 and deptno=30;--相当于 or ( and) --排序 order by默认升序 select * from emp order by sal ; select * from emp order by sal desc;
and 和or的优先级
主要以and为准
常用函数
1.字符函数
改变大小写lower()小写
大写upper()
initcap()使每个单词的首字母大写
substr()截取字符,从1开始
instr()检索字符
trim()删除首尾
replace()替换
2.数值函数
round()四舍五入
切断trunc()
取余mod()
3.日期函数
sysdate
4.转换函数
tochar() tonumber() todate()
函数的嵌套
通用函数
nvl(comm,0)将comm中的null字段变为0;
nvl2(a,b,c)如果a为null,返回b,否则返回c
nullif(a,b)比较两个表达式,如果相等返回空值,如果不等,返回第一个表达式
case表达式
decode函数
--常用函数 --字符函数 --改变大小写 select upper('a') from dual;--转大写 select lower('a') from dual;--小写 select initcap('aaaaa aaa') from dual;--使单词的每一个单词的首字母大写 select substr('aaa',2) from dual;--截取字符 从一开始 select instr('aab','b') from dual; --数值函数 select round(1.5) from dual; select mod(1,5) from dual;--取余 --日期函数 --转换函数 select to_char(123) from dual; select to_date('2020-08-01','yyyy-mm-dd') from dual; --通用函数 select nvl(comm,0)from emp;--给空的赋为0 --case表达式(相当于if else) --decode函数
多表连接和子查询
笛卡尔连接 将一条记录和一张表的情况全部连接起来
等值连接 非等值连接
内连接和外连接
等值连接分为内连接和外连接
加了where条件而且是等于的那种,称为等值连接 加了where条件但是条件不是等于的那种,称为非等值连接
标准sql内连接
select * from 表名 inner join 表名 on 条件
外连接和自连接
外连接分为左连接和右连接
左连接
select * from 表名 表名 where 条件=条件(+);
标准sql
select * from 表名 left outer join 表名 on 条件
右连接
select * from 表名 表名 where 条件(+)=条件;
标准sql
select * from 表名 right outer join 表名 on 条件
外连接
——在外连接中,某些不满足条件的聂也会显示出来
——也就是只显示其中一个表的行,而不限制另一个表的行
——这种连接形式在许多情况下非常有用
——oracle的写法 +号在右边,左边的表为主表,左边的表全部显示 右表补齐
——如果左表有记录而右表没有记录,则补空
自连接 左右都显示
select * from 表名 full outer join 表名 on 条件
--多表连接和子查询 --笛卡尔连接 --将每一条记录和另一张表的情况全部列举 a表5条记录b表有5条记录那么如果笛卡尔连接就有25条记录 select * from dept d,emp e; --等值连接在笛卡尔连接的基础上添加条件来进行筛选 select * from dept d,emp e where e.deptno=d.deptno; --非等值连接就是等值连接的条件不是相等的 --内连接 等值连接分为内连接和外连接 --内连接和等值连接的效果是一样的 --标准sql 所有的数据库支持sql语句 select * from dept d inner join emp e on d.deptno=e.deptno; --外连接 外连接分为左外连接和右外连接 --左外连接 oracle的写法 +号在放在条件的右边 ,以左边以基准,显示左边表的所有记录,右边补齐 --如果左边表有记录则右边表补null select * from dept d ,emp e where d.deptno=e.deptno(+); --标准sql 左外连接 left outer join....on 加outer与不加outer是一样的 select * from dept d left outer join emp e on d.deptno=e.deptno; --右连接 加号在左边 是什么连接就是以哪边为基准 加号不再哪边就以哪边为基准 --如果右边没有记录,但是左边表有记录,那么左边表的记录将会被删除 select * from dept d ,emp e where d.deptno(+)=e.deptno; --标准sql 右连接 right join .....on select * from dept d right outer join emp e on d.deptno=e.deptno; --自连接 --左右都显示 select * from dept d full outer join emp e on d.deptno=e.deptno;
聚合函数
count()计算有多少条记录
avg()数值型 平均值
sum()
max()
min()
数组分组
group by和聚合函数混合使用
如果在select语句中,那么就必须出现在group by 的子句当中,相反如果在group by子句当中出现的字段,那么就不必须出现select语句中
限定分组
having 分组之后再进行条件过滤
标准sql 排列顺序的固定的
select
from
where
group by
having
order by
where 与having的区别
where与having都是用来条件限制的
where中不可以使用聚合函数,而having可以使用聚合函数
集合运算
union 返回两条查询的结果 去除重复记录
union all 返回两条查询语句的结果包括重复的
intersect 交集都出现的记录
minus 在第一个查询当中,不在第二个查询当中
子查询
把多条查询语句并为一条语句(可以使用聚合函数)
子查询会在主查询之前执行
单行子查询
返回一条记录
返回多条记录(in)
any 与子查询的每一个值进行比较 小于就小于最大的 大于就大于最小的
all 与子查询返回的所有进行比较 小于就小于最小的 大于就大于最大的
多行子查询
相关子查询
exist() 判断子查询有数据吗?有就返回true 然后执行主查询
exist()只看外表,不看内表 如果数据量很大则没有影响 (使用的是loop方式)
in则与它相反
伪列rownum
根据结果集产生的伪数列,数据表中他是不存在的
他是用于标记结果集顺序的一个字段
这个字段被称为“伪数列”,也就是事实上不存在的数列。他的特点就是“顺序标记”,而且是逐次增加,换句话说只有存在rownum=1才有可能存在rownum=2
假设查询条件为rownum=2,那么在查询出第一条记录的时候,oracle标记citiao此条记录rownum为1,结果发现rownum=2的条件不符合,于是结果集为空
伪数列(rowid)
每一行数据对应rowid (存储的是内存中的地址)
由于他是存储内存当中的地址,所以使用他用来crud是最快的
--分组查询 注意不能为* 前面你要以什么为分组则要以什么为查询到的表的字段 不能直接* select deptno,count(*) from emp e group by e.deptno order by deptno; --查询每个部门每个工作的平均工资 select deptno,job,avg(sal) from emp group by deptno,job;--后面不能直接使用order by select deptno,job,avg(sal),count(job) from emp group by deptno,job;--deptno出现在select语句中,要么他在组函数当中,要么在group by的子句当中,就必须在group by的子句当中 --如果select语句中的列,要么在聚合函数当中,要么在group的子句当中 但是如果出现在group by的子句当中那么就不必须出现在 select语句的列中 --查寻部门平均工资大于两千的 select deptno,avg(sal) from emp group by deptno having avg(sal)>2000 order by deptno; --where 与having的区别 /* where是在分组之前进行条件过滤 having是在分组之后进行条件过滤 where不能使用聚合函数 having可以使用聚合函数 */ --集合运算 --union运算符从两个查询当中清除重复之后的结果 select deptno from dept union select deptno from emp; --相当于使用了distinct关键字 --union all返回所有包括重复的 4+4=8 select deptno from dept union all select deptno from emp; --intersect 取交集都出现的记录 select deptno from dept intersect select deptno from emp; --minus 在第一个查询当中不再第二个查询当中 select deptno from dept minus select deptno from emp; --子查询 --通过外部链接查询不符合连接条件的数据 --使用自连接让一个表连接他本身 --把多条查询语句合并成一条语句 --子查询会在主查询之前执行 --查询比allen 工资高的员工 select ename from emp where sal>( select sal from emp where ename='ALLEN' ); --查询ALLEN同一个部门的员工 select ename from emp where deptno=( select deptno from emp where ename='ALLEN'); --子查询会在主查询之前执行一次 --子查询的结果会被用于主查询 --工资高过公司平均工资的员工 select avg(sal) from emp ;--查出公司平均工资 --查询员工 select ename from emp; --进行组合 select ename, sal from emp where sal>( select avg(sal) from emp); --当子查询返回多个结果时要注意 select * from emp where sal in ( select min(sal) from emp group by deptno ); --ANY关键字 ANY与子查询返回的结果的每一个值比较 select * from emp where sal > ANY ( select min(sal) from emp group by deptno ); select * from emp where sal < ANY ( select min(sal) from emp group by deptno ); select * from emp where sal > ALL ( select min(sal) from emp group by deptno ) select * from emp where sal < ALL ( select min(sal) from emp group by deptno ) --当子查询没有返回结果时,就根据空结果的条件来进行查询 --EXISTS create table A( id number primary key, name varchar2(20) ); create table B( id number primary key, aid number, name varchar2(20), constraints tb_b_fk foreign key (aid) references A(id) ); insert into A(id,name) values(1,'a'); insert into A(id,name) values(2,'b'); select * from A; select * from B; insert into B(id,aid,name) values(1,1,'aa'); insert into B(id,aid,name) values(2,1,'ab'); insert into B(id,aid,name) values(3,2,'ba'); insert into B(id,aid,name) values(4,2,'bb'); select id,name from A where exists(select * from B where B.Aid=1); --子查询条件有值就返回true 然后执行主查询 他返回真就执行主查询 select id,name from A where exists(select * from B where B.Aid=3);--返回假值返回null值 --伪列 rownum --根据结果集产生的伪数列 本身是不存在的 select rownum deptno ,dname,loc from dept;--与下面那句是不同的 上面是将伪数列赋给deptno列取代了原来的 select rownum, deptno ,dname ,loc from dept; select deptno,dname,loc from dept where rownum=1;--查询到一条数据 select deptno,dname,loc from dept where rownum=2;--查询到0条数据 select deptno,dname,loc from dept where rownum<3;--查询到一条记录 select deptno,dname,loc from dept where rownum>0;--4条记录 select * from emp; --分页 select empno ,ename from ( select rownum tempid,empno ,ename from emp) t where t.tempid between 5 and 10; --rowid 伪数列 --他是有的 其实他是内存地址 使用他是最快的操作
删除重复数据
1.删除所有的重复数据
2.删除重复数据,留下一条
建立第三张中间表
清空老表
把第三张表的记录插入到老表中
删除第三张表
select * from emp; select rownum,rowid,empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; create table tb_test( name varchar2(18), age number ) insert into tb_test(name,age)values('tom',22); insert into tb_test(name,age)values('mary',23); insert into tb_test(name,age)values('tom',22); insert into tb_test(name,age)values('alice',24); insert into tb_test(name,age)values('tom',22); insert into tb_test(name,age)values('scott',21); insert into tb_test(name,age)values('scott',21); truncate table tb_test; --去除重复数据 --1重复数据完全删除2删除重复数据,但要保留一条 select * from tb_test; --重复数据完全被删除 delete from tb_test where name in( select t.name from tb_test t group by t.name,t.age having count(*)>1) --创建临时表 create table tb_test1 as select t.name,t.age from tb_test t group by t.name,t.age --清空重复数据表 truncate table tb_test;--可以回滚的 --插入数据没有重复的 insert into tb_test(name,age) select * from tb_test1; select * from tb_test; --删除中间表 drop table tb_test1 purge; --利用rowid去删除重复数据留下一条数据 delete from tb_test where rowid in( select a.rowid from tb_test a,tb_test b where a.rowid>b.rowid and a.name=b.name and a.age=b.age ) delete from tb_test where name in( 'tom','scott' ) select * from tb_test; --利用max(rowid) min(rowid)意思就是找到最大或者最小的留下来其他的删除 通过比较rowid 由于每次都要比较所以效率低 delete from tb_test where rowid not in(select max(rowid) from tb_test);--这样只是删除了地址留下了rowid最大的其他的都删除了 delete from tb_test a where rowid not in(select max(rowid) from tb_test b where a.name=b.name and b.age=a.age) delete from tb_test where rowid not in(select max(rowid) from tb_test group by name,age);
序列对象
序列是为了解决主键自动增长的。
1.自动生成唯一序列号 是可共享的对象
2.通常用来创建主键值
3.把序列缓存在内存中,可以加速访问序列的效率
create sequence 序列号名
序列有可能跳号:
原因:1 多表共用一个序列
2.数据库出现了问题
3.数据的回滚导致出现了跳号
同义字
方便操作,简化访问对象的操作
create synonym 同义字名 for 对象
索引对象
1.加速对表的访问
通过使用快速路径访问的方法快速定位数据,减少了磁盘的IO
与表独立存放,必须属于某个表不能单独存在 由数据库自动维护,表被删除时,索引也自动删除
自动创建索引
当表的字段的约束当中有主键约束或者是唯一约束的时候数据库自动创建了索引
手动创建索引
create index 索引名 on 表名(列名);
数据库查询方式
1.全盘扫描
2.通过索引来查询数据
在内存中开辟一个索引页,只有两个字段 一个索引字段,索引地址(在磁盘的内存地址)
3.共享语句
索引的维护
怎么样使用索引?
1.使用带索引的字段
2.表字段少不建议使用索引,因为使用索引他会占用内存
3使用原则:要在经常使用的字段使用索引,如果一张表经常做insert delete update 很少做查询,不建议使用索引 ,如过使用oracle要对其做额外的维护
索引是oracle自动维护的,索引使用久了,就会产生碎片,影响查询效果,所以使用久了需要手动进行维护(删除再进行重建)。
--同义词 --通过创建同义字来简化操作 select * from scott.emp; --创建同义字 create synonym tb_emp for scott.emp; --创建数据库连接 create database link linkfpp connect to system identified by orcl using '(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=LOCALHOST)(PORT=1521)) (CONNECT_DATA= (SERVER=DEDICATED) (SERVICE_NAME=orcl) ) )'; drop database link linkfpp; --表@数据库连接名 select * from dba_tables@linkfpp; create synonym tb_fpp_table for dba_tables@linkfpp; select * from tb_fpp_table; --索引 --索引也是数据库中一个对象 --通过使用快速路径访问的方法快速定位数据,减少了磁盘的I/O --与表独立存放,但不能独立存在,必须属于某个表 --由数据库自动维护,表如果被删除,那么他的索引也将被删除 --索引的作用类似书的目录,几乎没有一本书没有目录,所以几乎没有一张表没有索引 --自动索引 创建表自动创建索引 定义一个唯一约束和主键时,自动创建索引 --手动索引 create index index_tb_student_name on tb_student(lastname); create sequence tb_student_seq; drop sequence tb_studnet_seq; select * from tb_student; select * from tb_clazz; select * from tb_course; create sequence tb_course_seq; insert into tb_course(id,name,credit)values(tb_course_seq.nextval,'c++',123); insert into tb_student (id,lastname,age,sex,email,address,class_id,course_id,great) values(tb_student_seq.nextval,'1',1,'男','123@qq.com','123地址',1,2,13); select * from tb_student where lastname='1';--加了条件,而且条件是索引。 --数据库查询方式 --全盘扫描 --通过索引查询数据 --共享语句 --索引的维护 --不要把所有的字段都建索 --索引是用来加快数据查询速度的,如果一张表经常做inset delete update而很少做select 那么不建立索引,因为oracl要对索引进行维护 --如果一张表很少的数据,则不用建立索引 --索引是oracle自动维护的,索引使用久了就会产生索引碎片,影响查询效果,所以使用久了需要手动进行维护(删除再重建)
视图对象
create view 视图名 as 查询
删除视图
drop view 视图名