005

--视图
--视图是数据库对象之一
--视图在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)
原文地址:https://www.cnblogs.com/wangyuyanhello/p/8940918.html