oracle从入门到精通第五篇(视图|表空间|索引|存储过程|触发器|复制表)

视图:view

假表,用查询结果动态生成一张表
视图是编译后将查询结果保存在数据库中,下次在查询的时候不用编译,可以直接从视图中获取数据。

创建视图

CREATE VIEW v_name AS SELECT
student.NAME stuname,
school.NAME 
FROM
	student
	JOIN school ON student.sid = school.id;

查看视图:

select * from v_name;

删除视图:

drop view v_name;

为什么使用视图?
节省编译时间,提高查询效率
屏蔽原表中的字段,避免没有权限的用户查看
简单视图的数据能够动态来源于原表,复杂视图可以手动编译(alter view 视图名 compile;)

表空间:tablespace

在一段内存中因为多数存储的是表,所以称为表空间

Oracle当中每个用户都有属于自己的表空间
用户的表空间
普通用户的表空间
系统用户的表空间

为什么要给普通用户创建属于自己的表空间?
项目中很多时候会遇到多个项目访问同一个数据库,多个用户在访问同一个数据库的时候会产生资源争用问题,给不同的用户指定不同的表空间,就可以解决资源争用问题。

创建表空间:

create tablespace table_user   
datafile 'D:\table_user.dbf'     -- 文件位置
size 5M                                   -- 初始大小
autoextend on next 5M         -- 下一次拓展多少
maxsize 100M;                        -- 最大值

创建用户指定默认的表空间:

create user ET191201 identified by etoak
default tablespace table_user;

创建用户未指定表空间:

create user ET191202 identified by etoak;

创建用户以后修改指定表空间:

alter user ET191202 default tablespace table_user;

删除表空间:

删除表空间后,原先指向该表空间的用户仍然指向该表空间
需要通过alter user命令将用户的表空间重新指定到有效表空间

drop tablespace table_user including contents and datafiles;

索引

数据库会在具有唯一约束的列上自动添加唯一性索引

创建索引:

create index 索引名 on 表名(列名);
create index ind_name on student(salary);

删除索引:

drop index ind_name;

如何查看索引:

select table_name,index_name,uniqueness,status from user_indexes
where table_name = 'STUDENT';

索引类型:

普通索引:normal

create index 索引名 on 表名(列名);
create index ind_name on student(salary);

唯一性索引:unique

create unique index 索引名 on 表名(列名);
create unique index ind_cid on student(cid);

位图(分类)索引:bitmap

数据量比较大,基数比较小

create bitmap index 索引名 on 表名(列名);
create bitmap index ind_sid on student(sid);

函数索引:

create index 索引名 on 表名(函数(列名));
create index ind_length on student(length(name));

创建索引的优缺点:
能够更快的查询数据,有效的提高查询效率
数据量多,查询多,增删改少的列适合添加索引
增删改数据的时候,数据库会浪费资源去维护索引

存储过程:procedure

在服务器端能够被一个或者多个程序调用的sql语句集

创建存储过程:

create procedure 存储过程名(参数名 in 参数类型,参数名 out 参数类型)
as
变量名 变量类型 :=;
begin 
sql语句集;
end;

存储过程可以没有参数,如果没有参数的话则过程名之后不要出现括号
传入参数用in表示,传出参数用out表示
存储过程没有返回值,而是通过传出参数进行返回数据
可以多个传入参数,也可以有多个传出参数

练习:
如果传入参数是1,则返回你好
如果传入参数是2,则返回再见

create procedure pro_hi(cr in number,cc out varchar)
as
begin
if cr = 1 then cc := '你好';
else if cr = 2 then cc := '再见';
end if;
end if;
end;
/

调用存储过程:

declare 变量 变量类型 := 初始值;
begin 
sql 语句集;
end;

开启输出行:
set serveroutput on;

declare val varchar2(20) := '';
begin
pro_hi(1,val);
dbms_output.put_line(val);
pro_hi(2,val);
dbms_output.put_line(val);
end;
/

触发器:trigger

for each row:行级触发器

创建触发器:

create or replace trigger 触发器名
before/after insert/delete/update on 表名
for each row
begin
sql语句集;
end;

Oracle通过触发器调用序列来实现主键自增
1.创建表

create table test(id number(5) primary key,name varchar2(20))

2.创建序列

create sequence seq_test;

3.创建触发器

create or replace trigger tri_id
before insert on test
for each row
begin
select seq_test.nextval
into:new.id
from dual;
end;
/

4.插入数据

insert into test (name) values('橘子');
insert into test (name) values('苹果');

5.查询数据

select * from test;

通过触发器实现对表内数据操作的监测
1.创建日志表

create table dept_log(name varchar2(20),time date);

2.创建触发器

create or replace trigger tri_dept_log
before insert or delete or update on dept
declare val varchar2(20);
begin
if inserting then val := '增加数据';
elsif deleting then val := '删除数据';
elsif updating then val := '修改数据';
end if;
insert into dept_log values(val,sysdate);
end;
/

3.操作数据

insert into dept values(60,'教学部','山东易途');
update dept set loc = '中国易途' where deptno = 60;
delete from dept where deptno = 60;

4.查看日志表

select * from dept_log;

复制表:

1.复制表结构和表数据

create table dept2 as select * from dept;

2.复制表结构不复制表数据

create table dept3 as select * from dept where 1 = 2;

3.复制表,复制指定的几个列

create table dept4 as select deptno,dname from dept;

4.复制表,将新表中表的列名更改为其他名称

create table dept5(deptno1,dname1) as select deptno,dname from dept;

5.向已经存在的表中插入数据

insert into dept3(deptno,dname) select deptno,dname from dept;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值