视图 序列 索引 约束 事务

视图

在创建视图之前,要先给用户创建视图的权限,切换至管理员账户,输入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);--插入表中观察一下结果

约束

主要约束类型为

  1. 非空约束not null 约束列的值不能为null

  2. 唯一约束unique 约束列的值不可重复

  3. 主键约束primary key 约束列的值必须是非空且唯一的,一张表只能有一列主键

  4. 外键约束foreign key 表示两个表的主从关系,从表的数据一定要参考主表

  5. 检查约束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);
 --想要删除用户表,要先清空订单表,因为订单表还依赖着用户表呢

事务

事务拥有四大特性

  1. 原子性,保证事务中的所有操作,要么全都做,要么全都不做

  2. 一致性,保证事务操作前后必须全部满足规则的约束

  3. 隔离性,保证多个事务再对同一数据进行读写时不会出现不一致

  4. 持久性,保证事务在提交之后,数据上的变动永久的

在oracle中,所有的事务都是隐形开始的,只要对数据库进行更改,事务都会立刻自动启动,所以只需要注重于事务的一些控制和结束

我们平时进行的一些表数据的修改,变动,都不会立刻反映至数据库中,直到事务结束的时候,才会一起返回至数据库

 --oracle默认为非自动提交事务,可以使用命令查看
 show autocommit;
 set autocommit on;--打开自动提交事务
 commit;--手动指定提交事务
 savepoint 回滚点;--可设置一个可回滚的记录点
 roll back to 回滚点;--回滚到指定记录点
 release 回滚点;--删除相应记录点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值