oracle 逻辑对象
视图视图的作用: a 让查询返回的字段更容易理解。 b 对复杂select语句的封装。 c 安全性。视图可以单独授权。对于数据量巨大的表,可以创建视图仅仅返回前100条数据,将该视图select权限开放。但是不开放表的select权限。 --grant create view to resource; --a 让查询返回的字段更容易理解 create or replace view vw_emp as select empno 员工号,ename 员工名,job 工作岗位,sal 工资 from emp; select *from vw_emp; --b 对复杂的sql语句进行封装 --、薪水大于1200的雇员,按照部门编号进行分组,分组后平均薪水必须大于1500,查询各分组的平均水平,按照工资的倒序进行排列。* create or replace view vw_avg_sal as select deptno,avg(sal) avg_sal from emp where sal>1200 group by deptno having avg(sal)>1500 order by avg(sal) desc; select * from vw_avg_sal; --c安全性 试图可以单独授权,对于数据量巨大的表,可以创建视图仅仅返回前100条数据,将该视图select权限开放.但是不开放表的select权限。 create or replace view vw_sub_emp as select empno,ename,job,mgr,deptno from emp; grant select on scott.vw_sub_emp to zhangsan; select * from scott.vw_sub_emp; --d将普遍使用的子查询转换成视图,将提高查询效率。 练习--统计各部门员工数 create or replace view vw_countEmpByDept as select t.deptno 部门号,dname as 部门名,t.count_emp 员工数 from (select deptno,count(empno) count_emp from emp group by deptno) t inner join dept on dept.deptno=t.deptno; select * from vw_countEmpByDept; --显示员工部门数量最多的部门的详细信息 --第一种 create view vw_max_count as select * from dept where dept.deptno=( select 部门号 from vw_countEmpByDept where 员工数= (select max(员工数) from vw_countEmpByDept)); select * from vw_max_count; --第二种 select * from dept inner join (select deptno 部门号,count(empno) count_emp from emp group by deptno having count(empno)=( select max(mycount) from (select count(empno) mycount from emp group by deptno) )) on dept.deptno=部门号; --获得平均工资最高部门的详细信息、(把子查询转换成视图,在关联视图中完成) create view vw_avg_dept as select deptno 部门编号,avg(sal) 平均薪资 from emp group by deptno; select * from dept where deptno=( select 部门编号 from vw_avg_dept where 平均薪资= (select max(平均薪资) from vw_avg_dept)); 注意: A、oracle视图中的select语句可以含order排序 区别与sql server B、视图仅仅是数据的另一种表现方式,本身没有引入新的数据 C、视图允许进行“增删改”,但强烈建议不对视图进行增删改。(我宁愿你们不知道这个点,但考试如果考到判断题要会答) 索引“索引”--index。对数据记录起"目录"作用,加快查询速度。代价是消耗硬盘空间。 索引又分为聚集索引和非聚集索引。区别是:表记录的排列顺序和与索引的排列顺序是否一致。 实例:聚集就是按字母查字典,字典页码和字母顺序一样。非聚集就是按偏旁部首查字典。偏旁部首顺序和字典页码顺序不一致。 具体区别: 1.聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。 2.聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。 3.聚集索引查询数据速度快,插入数据速度慢;非聚集索引反之。 就好像数组和链表的关系。 唯一索引:(聚集唯一和非聚集唯一:一般而言主键是聚集唯一,其他是非聚集唯一。) 唯一索引和唯一约束的关系:索引是具有物理结构的,只要唯一索引在就不能存放相同值,唯一约束是建立在唯一索引基础上的逻辑结构。所以只要表t的字段a满足“唯一约束”,那么就会自动建立“唯一索引”。一般而言这两种用法效果相同没什么区别。 注意:一个表可以含有多个唯一索引。 create unique index 索引名 on 表名.(字段名) --创建索引 alter index 索引名 rebuild; --重建索引 --索引 index,对数据记录其目录作用,加快查询速度,代价是消耗硬盘空间。 create table myuser( id number primary key,--主键约束,number 默认为(12,2) uname varchar2(20) not null,password varchar(20) not null check(length(password)>=6) --检查约束 ) create unique index uname_idx on myuser(uname); insert into myuser values(1,'zhangsan','123456'); insert into myuser values(2,'123456'); alter index uname_idx rebuild; drop index uname_idx; select * from myuser; 序列序列: 实现多张表的主键统一管理; 实现基于字符串主键的递增规则 CREATE SEQUENCE sequence //创建序列名称 [INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1 ? [START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue ? [{MAXVALUE n | NOMAXVALUE}] //最大值 ? [{MINVALUE n | NOMINVALUE}] //最小值 ? [{CYCLE | NOCYCLE}] //循环/不循环 即达到最大后从头开始 ? [{CACHE n | NOCACHE}];//分配并存入到内存中 --序列 --实现多张表主键的统一管理 --实现基于字符串主键的递增规则 create sequence my_se --创建序列名称(最简单的序列,第一句就行了,下面的是可选) increment by 1 --递增的序列值 start with 1 --开始的值 maxvalue 999999999 --minvalue n | nominvalue --最小值 nocycle --循环、不循环 就是到达最大值之后从头开始 cache 20 --分配并存入内存中 -- my_se.currval 当前值 -- my_se.nextval 下一个值 select my_se.nextval from dual;--要先启动序列,必须用nextval select my_se.currval from dual; --同一次查询中两次序列取值相同 select my_se.nextval,my_se.nextval from dual; --序列作用:产生递增的不重复的字段,通常用于生成主键的值。用在给主键赋值 --案例一 实现多张表的主键的统一管理 --表:福建动车系统 、广东动车系统 、江西动车系统 --要求:国家要求所有动车系统的票根符合统一规则,可以采用公开的一个序列对象进行统一编号。 create table FJtrain( tid number(10) primary key,tname varchar2(20) ); create table GDtrain( tid number(10) primary key,tname varchar2(20) ); create table JXtrain( tid number(10) primary key,tname varchar2(20) ); insert into FJtrain values(my_se.nextval,'厦门-福州'); insert into GDtrain values(my_se.nextval,'深圳-广州'); insert into JXtrain values(my_se.nextval,'南昌-赣州'); select * from FJtrain; select * from GDtrain; select * from JXtrain; --案例二 实现基于字符串主键的递增规则 --要求:主键是字符串,如何用序列去做改造 create table stu( sno varchar2(10) primary key,sname varchar2(20) not null ); insert into stu values('s'||my_se.nextval,'张老大'); insert into stu values('s'||my_se.nextval,'李老二'); insert into stu values('s'||my_se.nextval,'赵老二'); select * from stu; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |