093数据库视图序列索引约束练习整理.docx
- 文档编号:1175202
- 上传时间:2022-10-18
- 格式:DOCX
- 页数:18
- 大小:109.79KB
093数据库视图序列索引约束练习整理.docx
《093数据库视图序列索引约束练习整理.docx》由会员分享,可在线阅读,更多相关《093数据库视图序列索引约束练习整理.docx(18页珍藏版)》请在冰豆网上搜索。
093数据库视图序列索引约束练习整理
视图、序列、索引
1.1.视图
1.1.1.什么是视图
视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被给予一个名字,即视图名字。
视图本身并非包括任何数据,它只包括映射到基表的一个查询语句,当基表数据发生转变,视图数据也随之转变。
创建视图的语法:
01.CREATE[ORREPLACE]VIEWview_name[(alias[,alias…])]
02.ASsubquery;
视图创建后,能够像操作表一样操作视图,主若是查询操作。
语法中的Subquery是SELECT查询语句,对应的表被称作基表。
依照视图所对应的子查询种类分为几种类型:
•SELECT语句是基于单表成立的,且不包括任何函数运算、表达式或分组函数,叫做简单视图,现在视图是基表的子集;
•SELECT语句一样是基于单表,但包括了单行函数、表达式、分组函数或GROUPBY子句,叫做复杂视图;
•SELECT语句是基于多个表的,叫做连接视图。
1.1.2.视图的作用
若是需要常常执行某项复杂查询,能够基于那个复杂查询成立视图,尔后查询此视图即可,简化复杂查询;
视图本质上确实是一条SELECT语句,因此当访问视图时,只能访问到所对应的SELECT语句中涉及到的列,对基表中的其它列起到平安和保密的作用,能够限制数据访问。
1.1.3.授权创建视图
创建视图的DDL语句是CREATEVIEW,用户必需有CREATEVIEW系统权限,才能创建视图。
若是没有权限,创建视图时会提示:
权限不足。
治理员能够通过DCL语句授予用户创建视图的权限。
下例中治理员给用户tarena创建视图的权限:
01.GRANTCREATEVIEWTOtarena;
1.1.4.创建简单视图(单表)
创建一个简单视图V_EMP_10,来显示部门10中的员工的编码、姓名和薪水:
01.CREATEVIEWv_emp_10
02.AS
03.SELECTempno,ename,sal,deptno
04.FROMemp
05.WHEREdeptno=10;
查看视图结构:
01.DESCv_emp_10;
1.1.5.查询视图
查询视图和查询表的操作相同:
01.SELECT*FROMv_emp_10;
现在视图的列名,和创建视图时的列名一致,不必然是原列名:
01.SELECTid,name,salaryFROMv_emp_10;
1.1.6.对视图进行INSERT操作
视图本身并非包括数据,只是基表数据的逻辑映射。
因此当对视图执行DML操作时,事实上是对基表的DML操作。
对视图执行DML操作的大体原那么:
•简单视图能够执行DML操作,以下情形除外:
在基表中概念了非空列,但简单视图对应的SELECT语句并无包括那个非空列,致使那个非空列对视图不可见,这时无法对视图执行INSERT操作;
•若是视图概念中包括了函数、表达式、分组语句、DISTINCT关键字或ROWNUM伪列,不许诺执行DML操作;
•DML操作不能违背基表的约束条件。
对简单视图执行INSERT操作,成功插入数据到基表中:
01.INSERTINTOv_emp_10
LUES(1234,'DOCTOR',4000,10);
简单视图能够通过DML操作阻碍到基表数据。
1.1.7.创建具有CHECKOPTION约束的视图
语法如下:
01.CREATE[ORREPLACE]VIEWview_name[(alias[,alias…])]
02.ASsubquery
03.[WITHCHECKOPTION];
其中:
WITHCHECKOPTION短语表示,通过视图所做的修改,必需在视图的可见范围内:
•假设INSERT,新增的记录在视图仍可查看
•假设UPDATE,修改后的结果必需能通过视图查看到
•假设DELETE,只能删除现有视图里能查到的记录
创建带有CHECKOPTION约束的视图:
01.CREATEORREPLACEVIEWv_emp_10
03.SELECTempnoid,enamename,salsalary,deptno
04.FROMemp
05.WHEREdeptno=10
06.WITHCHECKOPTION;
下述DML语句操作失败,因为部门20不在视图可见范围内:
01.INSERTINTOv_emp_10VALUES(1008,‘donna’,5500,20);
02.UPDATEv_emp_10SETdeptno=20WHEREid=7782;
1.1.8.创建具有READONLY约束的视图
对简单视图进行DML操作是合法的,可是不平安的。
若是没有在视图上执行DML操作的必要,在成立视图时声明为只读来幸免这种情形,保证视图对应的基表数据可不能被非法修改。
加入READONLY约束的视图语法如下:
01.CREATE[ORREPLACE]VIEWview_name[(alias[,alias…])]
02.ASsubquery
03.[WITHREADONLY];
创建视图,带有READONLY约束:
01.CREATEORREPLACEVIEWv_emp_10
03.SELECTempno,ename,sal,deptnoFROMemp
04.WHEREdeptno=10
05.WITHREADONLY;
现在对只读视图执行DML操作,将会失败:
01.INSERTINTOv_emp_10
02.VALUES(1258,'DONNA',3000,10);
取得如下结果:
ERROR位于第1行:
ORA-01733:
此处不许诺虚拟列
1.1.9.通过查询USER_VIEWS获取相关信息
和视图相关的数据字典有:
•USER_OBJECTS
•USER_VIEWS
•USER_UPDATABLE_COLUMNS
例一:
在数据字典USER_OBJECTS中查询所有视图名称:
01.SELECTobject_nameFROMuser_objects
02.WHEREobject_type='VIEW';
例二:
在数据字典USER_VIEWS中查询指定视图:
01.SELECTtextFROMuser_views
02.WHEREview_name='V_EMP_10';
例三:
在数据字典USER_UPDATABLE_COLUMNS中查询视图:
01.SELECTcolumn_name,insertable,updatable,deletable
02.FROMuser_updatable_columns
03.WHEREtable_name='V_EMP_10';
1.1.10.创建复杂视图(多表关联)
复杂视图指在子查询中包括了表达式、单行函数或分组函数的视图。
现在必需为子查询中的表达式或函数概念别名。
例如,创建一个视图V_EMP_SALARY,把职员表的数据按部门分组,取得每一个部门的平均薪水、薪水总和、最高薪水和最低薪水:
01.CREATEVIEWv_emp_salary
03.SELECTd.dname,avg(e.sal)avg_sal,sum(e.sal)sum_sal,
04.max(e.sal)max_sal,min(e.sal)min_sal
05.FROMempejoindeptd
07.GROUPBYd.dname;
查询复杂视图:
01.SELECT*FROMv_emp_salary;
复杂视图不许诺DML操作,会报错。
当再也不需要视图的概念,能够利用DROPVIEW语句删除视图,语法如下:
01.DROPVIEWview_name;
例如删除视图v_emp_10:
01.DROPVIEWv_emp_10;
视图尽管是寄存在数据字典中的独立对象,但视图仅仅是基于表的一个查询概念,因此对视图的删除可不能致使基表数据的丢失,可不能阻碍基表数据。
1.2.序列
1.2.1.什么是序列
序列(SEQUENCE)是一种用来生成唯一数字值的数据库对象。
序列的值由Oracle程序按递增或递减顺序自动生成,通经常使用来自动产生表的主键值,是一种高效率取得唯一键值的途径。
序列是独立的数据库对象,和表是独立的对象,序列并非依附于表。
通常情形下,一个序列为一个表提供主键值,但一个序列也能够为多个表提供主键值。
1.2.2.创建序列
创建序列的语法:
SEQUENCE[schema.]sequence_name
02.[STARTWITHi][INCREMENTBYj]
03.[MAXVALUEm|NOMAXVALUE]
04.[MINVALUEn|NOMINVALUE]
05.[CYCLE|NOCYCLE][CACHEp|NOCACHE]
其中:
•sequence_name是序列名,将创建在schema方案下
•序列的第一个序列值是i,步进是j
•若是j是正数,表示递增,若是是负数,表示递减
•序列可生成的最大值是m,最小值是n
•若是没有设置任何可选参数,序列的第一个值是1,步进是1
•CYCLE表示在递增至最大值或递减至最小值以后是不是继续生成序列号,默许是NOCYCLE
•CACHE用来指定先预取p个数据在缓存中,以提高序列值的生成效率,默许是20
1.2.3.利用序列
举例说明,创建一个序列,起始数据是100,步进是10:
01.CREATESEQUENCEemp_seq
02.STARTWITH100
03.INCREMENTBY10;
当序列被创建后,第一个序列值将是100,将要生成的序列号别离是110、120、130等。
序列中有两个伪列:
•NEXTVAL:
获取序列的下个值
•CURRVAL:
获取序列的当前值
当序列创建以后,必需先执行一次NEXTVAL,以后才能利用CURRVAL。
获取序列的第一个值,而且利用序列值为EMP表插入新的记录:
01.SELECTemp_seq.NEXTVALFROMDUAL;
02.INSERTINTOemp(empno,ename)
03.VALUES(emp_seq.NEXTVAL,'donna');
查询方才生成的记录,主键值将是110:
01.SELECTempno,enameFROMemp
02.WHEREename='DONNA';
现在查询序列的当前值,会取得110的数字。
LECTemp_seq.CURRVALFROMDUAL;
在序列的利用进程中,比如执行了一条语句:
01.SELECTemp_seq.NEXTVALFROMDUAL
那么浪费了一个序列值,会致使表的主键值不持续。
而CURRVAL的利用可不能致使序列值的递进。
1.2.4.删除序列
删除序列的语法如下:
01.DROPSEQUENCEsequence_name;
1.3.索引
1.3.1.索引的原理
索引是一种许诺直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 093 数据库 视图 序列 索引 约束 练习 整理
![提示](https://static.bdocx.com/images/bang_tan.gif)