视图
在创建视图之前,要先给用户创建视图的权限,切换至管理员账户,输入grant create view to scott;给scott用户创建视图的权限,然后重新切换回scott用户进行操作。
创建视图命令:create or replace view 视图名 as select 表结构名 from 表名;视图创建完成后可直接套用表查询命令进行查询
例:
--建立视图,查询员工姓名与入职日期,员工的职务
create or replace view v_emp as select ename,hiredate,job from emp;
select ename from v_emp;
这种不包含任何函数,表达式,分组且基于单个表格建立的视图叫做简单视图,如果包含了
函数,表达式,分组且基于单个表格建立的视图则为复杂视图:
例:
--按部门统计人数和最低工资,有group by语句,这已经算复杂视图了
create or replace view v_count_emp as select
count(*) count ,deptno,min(sal) min from emp group by deptno;
--分组函数中的使用的函数要赋予别名,例如这里的count,min
如果基于多个表格建立视图,则为连接视图:
例:
--创建视图,查询员工姓名,员工的职务,部门编号,部门名称,工资等级
--视图的数据来源是多张表,连接视图
create or replace view v_emp_dept as select
e.ename name,e.job job,d.deptno deptno,d.dname dname , g.grade grade
from emp e
inner join dept d on e.deptno = d.deptno
inner join salgrade g on e.sal between g.losal and g.hisal;
想要修改视图的数据,可以使用命令update,delete,和修改表格同理,只能对简单视图数据进行修改,但是由于对于视图的修改会直接反馈回原表,所以一般不允许修改视图数据,所以要在创建视图的create语句的末尾,加入一句with read only,让它成为只读视图,不给予修改权限,删除视图也与表格一直,直接drop view 视图名;即可
序列
序列是oracle独有的内容,用来生成唯一的不重复的数字,一般用来给主键赋值,让主键递增
例:
create table test04(
id number(11) primary key,
name varchar(20)
);
create sequence seq_test04
increment by 10--默认1,每次递增量
start with 8--默认1,开始量
cache 10;--默认20一般就用上面两行
序列使用的时候,是使用currval调用当前值,用nextval调用下一个值,但是刚刚创建序列的时候,获取不到任何当前信息,需要针对序列先调用一次nextval之后才能进行正常逻辑上的使用
select seq_test04.currval from dual;--当前值
select seq_test04.nextval from dual;--下一个值
insert into test04 values (seq_test04.nextval,'name'||seq_test04.currval);--插入表中观察一下结果
但是,只要你查一次序列的nextval,序列值就会按照递加量递加一次,不论你有没有使用它,这就导致如果在表外一旦读取一次nextval,再回到表内使用序列,会让表内的主键列数据不再连续,这就叫序列的裂隙
索引
索引的存在是为了提升数据查询的效率,一旦建立就会被oracle自动维护,在查询中自动使用
索引主要分为聚集索引,非聚集索引,索引的顺序和表记录数据的顺序一致,称为聚集索引,否则则为非聚集索引,还有另一种分类,索引如果建立在一列上为单列索引,建立在多个列上为联合索引
索引最重要的部分就是索引的关键字和指向表中相应位置的指针
主键和唯一约束列一定要建立索引,感觉经常被查询或者经常被用在where中的列最好建立索引
相应的,如果是经常需要修改的,数据量很少的列不用建立索引,或者是很少被查询的列也不用建立索引
select seq_test04.currval from dual;--当前值
select seq_test04.nextval from dual;--下一个值
insert into test04 values (seq_test04.nextval,'name'||seq_test04.currval);--插入表中观察一下结果
约束
主要约束类型为
-
非空约束not null 约束列的值不能为null
-
唯一约束unique 约束列的值不可重复
-
主键约束primary key 约束列的值必须是非空且唯一的,一张表只能有一列主键
-
外键约束foreign key 表示两个表的主从关系,从表的数据一定要参考主表
-
检查约束check 约束列的数据一定在某个范围内
可以在建表的时候对数据列进行约束
create table test05(
id number(11) primary key,--主键约束
name varchar(20) not null,--非空约束 像这样直接定义,系统会自动帮你分配默认名称,不用自己取名
age number(3),
gender char(3),
idcard varchar(30),
constraint age_ck check(age>0 and age<120),--检查约束,在申明完结构之后定义约束就要求自己给名字
constraint gender_ck check(gender='男' or gender='女'),
constraint idcard_uk unique(idcard)--唯一约束
);
也可以在建表之后,临时补充或者删除约束
create table test06(
id number(11),
name varchar(20),
age number(3),
gender char(3),
idcard varchar(30)
);
alter table test06 add constraint id_pk primary key(id);
alter table test06 add constraint name_uk unique(name);
alter table test06 drop constraint name_uk;
alter table test06 drop constraint id_pk;
外键约束是用来约束两个表的关系的
create table t_user(
id number(4) primary key,
name varchar2(20)
);
create table t_order(
id number(4)primary key,
name varchar2(20),
user_id number(4)
);
--为t_order添加了一个外键约束,userid这一列要参考t_user的id这列
alter table t_order add constraint user_order_fk
foreign key(user_id) references t_user(id);
insert into t_user values(1001,'a');
insert into t_user values(1002,'b');
insert into t_user values(1003,'c');
insert into t_order values(1111,'wahaha',1001);
--想要删除用户表,要先清空订单表,因为订单表还依赖着用户表呢
事务
事务拥有四大特性
-
原子性,保证事务中的所有操作,要么全都做,要么全都不做
-
一致性,保证事务操作前后必须全部满足规则的约束
-
隔离性,保证多个事务再对同一数据进行读写时不会出现不一致
-
持久性,保证事务在提交之后,数据上的变动永久的
在oracle中,所有的事务都是隐形开始的,只要对数据库进行更改,事务都会立刻自动启动,所以只需要注重于事务的一些控制和结束
我们平时进行的一些表数据的修改,变动,都不会立刻反映至数据库中,直到事务结束的时候,才会一起返回至数据库
--oracle默认为非自动提交事务,可以使用命令查看
show autocommit;
set autocommit on;--打开自动提交事务
commit;--手动指定提交事务
savepoint 回滚点;--可设置一个可回滚的记录点
roll back to 回滚点;--回滚到指定记录点
release 回滚点;--删除相应记录点