--视图 --视图是数据库对象之一 --视图在sql语句中体现的角色与表一致但其并不是表,他只是对应了一个查询语句的结果集 create view v_emp_coco as select empno,ename,sal,deptno from emp_coco where deptno=10 --查询视图与查询表一样 select * from v_emp_coco --查看视图的结构 desc v_emp_coco --视图对应的子查询若含有函数或者表达式那么必须给别名 --当一个字段使用了别名那么视图中该字段的名字就是这个别名 --修改视图 --由于视图只是对应了一个查询语句,所以修改视图就是替换该sql语句 create or replace view v_emp_coco as select empno id,ename name,sal salary,deptno from emp_coco where deptno=10 with check option--检查选项 --对视图进行DML操作 --对视图进行dml操作就是对视图数据来源的基础表进行操作, --并且只能对视图可见的字段进行 insert into v_emp_coco (id,name,salary,deptno) values (1001,'jack',5000,10) select * from emp_coco --修改也是对基础表的修改 update v_emp_coco set salary=6000 where id=1001 --删除也一样 delete from v_emp_coco where id=1001 --通过对视图操作的数据,若视图不可见那么就等同与对基表数据进行了污染(尽量避免) --插入 insert into v_emp_coco (id,name,salary,deptno) values (1001,'jack',5000,20)、 --更新 update v_emp_coco set deptno=20 --删除,不会发生数据污染 delete from v_emp_coco where deptno=20 select * from v_emp_coco select * from emp_coco --为视图添加检查选项可以避免对视图进行dml操作后对基表有数据污染的情况 --检查选项要求对视图进行的dml操作的数据视图必须对其可见,否则不允许操作 insert into v_emp_coco (id,name,salary,deptno) values (1001,'jack',5000,20) --此时会报错 update v_emp_coco set deptno=20 --read only选项 --当视图添加了只读选项后,该视图仅能查看,不能执行任何dml操作 create or replace view v_emp_coco as select empno id,ename name,sal salary,deptno from emp_coco where deptno=10 with read only --dml操作会报错 insert into v_emp_coco (id,name,salary,deptno) values (1001,'jack',5000,10) --数据字典 --USER_OBJECTS:记录了用户创建的所有数据库对象 select object_name from user_objects where object_type='TABLE' --user_views:记录了用户创建的所有视图 select text from user_views where view_name = 'V_EMP_COCO' --user_tables:记录了用户创建的所有表 SELECT table_name from user_tables --创建复杂视图(多表关联) --复杂视图不允许dml操作 --把职员表的数据按部门分组,获得每个部门的 create view v_emp_dept_coco as select max(sal) max_sal,--必须有别名 min(sal) min_sal, avg(sal) avg_sal, sum(sal) sum_sal, d.deptno,d.dname from emp_coco e,dept_coco d where e.deptno=d.deptno group by d.deptno,d.dname select * from v_emp_dept_coco --查看比自己所在部门平均工资高的员工 select e.ename,e.sal,e.deptno from emp_coco e,v_emp_dept_coco d where e.deptno=d.deptno and e.sal>d.avg_sal --删除视图 --删除视图中的数据时,会对应的将基表数据删除 --但是删除视图本身时,是不会影响基表任何数据的 drop view v_emp_coco --序列,数据库对象之一 --序列是用来生成一系列数字的,序列生成的数字常被用做某张表主键字段的值 create sequence seq_emp_coco_id start with 1 increment by 1 --序列提供了两个伪列用于获取当前序列的值 --NEXTVAL:获取序列下一个数,这个为例会导致序列发生步进, --序列不能回退的,即:生成下一个数字后,就不能得到之前的数字了 --CURRVAL:获取序列当前值(最后一次生成的值)无论调多少次都不会导致序列发生步进 --新创建的序列要至少调用一次NEXTVAL后才可以使用CURRVAL select seq_emp_coco_id.currval from dual insert into emp_coco (empno,ename,sal,job,deptno) values (seq_emp_coco_id.nextval,'JACK',5000,'CLK',10) SELECT * from emp_coco --删除序列 drop sequence seq_emp_coco_id --索引,数据库对象之一 --作用时提高查询效率 --索引的建立是数据库执行完成的,过程对我们是透明的,我们只需要告诉数据库是否添加索引即可 --索引的应用也是自动的,无需在查询的过程中告知数据库是否使用索引, --数据库会自行判断可用索引并自动使用 create index idx_emp_coco_ename on emp_coco(ename) --当只用ename作为过滤条件(除了like),作为排序的字段,去重等操作时 --数据库会自动使用索引idx_emp_ename提高查询效率 create index inx_emp_coco_job_sal on emp_coco(job,sal) select empno,ename,sal,job from emp_coco order by job,sal create index inx_emp_coco_upper_idx on emp_coco(upper(ename)) select * from emp_coco where upper(ename)='KING' --重构一个索引 alter index idx_emp_coco_ename rebuild --删除索引 drop index idx_emp_coco_ename --非空约束 create table employees_coco( eid number(6), name varchar(30) not null, salary number(7,2), hiredate date constraint employees_coco_hiredate_nn not null ) desc employees_coco --约束分为表级约束与列级约束 --not null只是列级约束 其他约束即是表级约束也是列级 --列级约束:为某个字段添加约束只能在操作(修改)该列的同时进行 alter table employees_coco modify(eid number(6) not null) alter table employees_coco modify(eid number(6) null)--取消非空约束 --表级约束:可以直接对表进行添加约束并指定为该表的那个字段添加 --简单说:添加约束时的语法不一样 create table employees_coco1( eid number(6) unique, name varchar(30), email varchar(50), salary number(7,2), hiredate date, --唯一性约束 --唯一性约束可以要求某个字段 constraint employees_coco1_email_uk unique(email)) drop table employees_coco1 insert into employees_coco1 (eid,name,email) values (3,'jack','jck3@qq.com') select * from employees_coco1 delete from employees_coco1 alter table employees_coco1 add constraint employees_coco1 unique(name) --主键约束 --主键约束只能建立在单列上,并且一张表只能有一个主键约束 --主键约束可以保证该字段非空且唯一 create table employees_coco2( eid number(6) primary key, name varchar(30), email varchar(50), salary number(7,2), hiredate date) select * from employees_coco2 insert into employees_coco2 (eid,name) values (2,'jack') --检查约束 alter table employees_coco2 add constraint employees_coco2_salary_check check(salary>2000) insert into employees_coco2 (eid,name,salary) values (1234,'donna',2500)