Oracle面试题.docx
- 文档编号:10215890
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:20
- 大小:23.81KB
Oracle面试题.docx
《Oracle面试题.docx》由会员分享,可在线阅读,更多相关《Oracle面试题.docx(20页珍藏版)》请在冰豆网上搜索。
Oracle面试题
Oracle(66道)
一、理论题(15道)
1.什么是视图?
视图的作用是什么?
如何创建视图?
(1)定义:
视图是一个虚拟表,其内容由查询定义。
同真实的表一样,视图包含一系列带有名称的列和行数据。
但是,视图并不在数据库中以存储的数据值集形式存在。
(2)作用:
简化查询保护我们的一些私有数据,通过视图也可以用来更新数据,但是我们一般不这么用缺点:
要对视图进行维护。
(3)创建:
创建视图需要CREAEVIEW系统权限,视图的创建语法如下:
CREATE[ORREPLACE][FORCE|NOFORCE]VIEW视图名[(别名1[,别名2...])]
AS子查询
[WITHCHECKOPTION[CONSTRAINT约束名]]
[WITHREADONLY]
2.什么是索引?
为什么使用索引?
如何使用索引?
(1)索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。
如果没有索引,执行查询时必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。
表里面的记录数量越多,这个操作的代价就越高。
如果作为搜索条件的列上已经创建了索引,无需扫描任何记录即可迅速得到目标记录所在的位置。
如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
(2)索引主要是为了加快查询的速度。
(3)使用:
CREATEUNIUQE|BITMAPINDEX
ON
(
TABLESPACE
STORAGE
LOGGING|NOLOGGING
COMPUTESTATISTICS
NOCOMPRESS|COMPRESS
NOSORT|REVERSE
PARTITION|GLOBALPARTITION
相关说明
1)UNIQUE|BITMAP:
指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2)
可以对多列进行联合索引,当为expression时即“基于函数的索引”
3)TABLESPACE:
指定存放索引的表空间(索引和原表不在一个表空间时效率更高)
4)STORAGE:
可进一步设置表空间的存储参数
5)LOGGING|NOLOGGING:
是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)
6)COMPUTESTATISTICS:
创建新索引时收集统计信息
7)NOCOMPRESS|COMPRESS
是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)
8)NOSORT|REVERSE:
NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值
9)PARTITION|NOPARTITION:
可以在分区表和未分区表上对创建的索引进行分区
3.SQL语句索引优化规则
①不带where条件的SQL语句一定不能使用索引
②在where条件中有索引的字段不能使用函数
例子:
假设我们查询在1987年参加工作的所有员工
SQL>select*fromempwhereto_char(hiredate,'yyyy')='1987';
③在where条件中有索引的字段不能参与运算
例子:
查询在10000天以前参加工作的员工信息
SQL>select*fromempwheresysdate-hiredate>10000;
SQL>select*fromempwherehiredate ④尽量少用notin,notexists,like'%'等关键字 ⑤书写查询语句的时候,应该首先考虑关联查询、其次考虑集合查询,最后考虑子查询 ⑥where条件中限制性强的条件应该写在where最后的一个条件 where条件从右向左经行条件解析 ⑦多表查询中,驱动表应该是返回数据少的表 例子: 查询部门account的所有员工信息 SQL>selecte.*,d.dnamefromempe,deptdwheree.deptno=d.deptnoandd.dname='ACCOUNTING'; 4.DDL语句包括哪些? Createtable,altertable,droptable等 5.DML语句包括哪些? Select,update,delete,insert 6.Select的格式? Select列名列表from表名1[,表名2][,表名n]where条件groupby列名1[,列名2][,列名n]having分组条件orderby列名[asc|desc] 7.Oracle数据库启动时必需开启的后台服务 ①OracleOrahome90TNSListener使第三方的软件或语言访问 ②OracleServiceETCOracle的实例CRUD增删改查 注意: ②中的ETC是你起的实例的名字 8什么是事务? .transacation事务特点? 如何使用事务? (1)事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begintransaction和endtransaction语句(或函数调用)来界定。 事务由事务开始(begintransaction)和事务结束(endtransaction)之间执行的全体操作组成。 例如: 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。 事务是恢复和并发控制的基本单位。 (2)事务的四个特性 ①原子性不可分割 ②持久性->当数据写入到数据库物理文件中后,该数据被持久化 ③隔离性->事务之间相互独立互不干扰 ④一致性->数据安全 (3)使用: 整体提交(commit)整体回滚(rollback) 9.Oracle备份数据表数据 ①createtable备份表名称as查询语句; ②Oracle备份表结构 createtableemp_bakasselect*fromempwhere1=2; 10.Oracle备份数据库 (1)冷备份 冷备份是Oracle最简单的一种备份;执行冷备份前必须关闭数据库;然后使用操作系统实用工具或者第三方工具备份所有相关的数据库文件。 优点: 能简单快速地备份。 能简单快速地恢复。 执行简单。 缺点: 必须关闭数据库,不能进行点恢复。 (2)热备份 热备份是当数据库正在运行时进行数据备份的过程。 执行热备份的前提是: 数据库运行在可归档日志模式。 适用于24X7不间断运行的关键应用系统。 优点: 备份时数据库可以是打开的。 热备份可以用来进行点恢复。 初始化参数文件、归档日志在数据库正常运行时是关闭的,可用操作系统命令拷贝。 缺点: 执行过程复杂。 由于数据库不间断运行,测试比较困难。 不能用操作系统实用工具拷贝打开的文件。 必须使用Oracle提供的ocopy工具来拷贝打开的文件。 热备份可能造成CPU、I/O过载,应在数据库不太忙时进行。 (3)Export导出数据库对象 冷备份和热备份都备份物理数据库文件,因而被称为物理备份。 而export备份的是数据库对象,因此被称为逻辑备份。 优点: 能执行对象或者行恢复。 备份和恢复速度更快。 能够跨操作系统平台迁移数据库。 数据库可一直运行。 缺点: export并不是冷备份和热备份的替代工具。 冷、热备份可保护介质失效。 export备份可保护用户或应用错误。 将数据库TEST完全导出,用户名system密码manager导出到D: daochu.dmp中 expsystem/manager@TESTfile=d: daochu.dmpfull=y 11.to_char和to_date函数应用 (1)to_char 语法: to_char(时间数据,制定格式) SQL: >selectto_char(sysdate,'yyyy-mm-ddhh24: mi: ssddddday')fromdual; yyyy-mm-dd年月日 hh24: mi: ss时分秒(24) d一周第几天 ddd一年的第几天 day星期几 (2)to_date: 将文本类型数据按照制定格式转换成时间类型数据 语法: to_date('具体的时间字符数据','时间字符串格式') to_date('2010-01-19','yyyy-mm-dd') 注意: Oracle中的date字段类型及其特殊 12.存储过程定义及优势? (1)定义: 存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。 在ORACLE中,若干个有联系的过程可以组合在一起构成程序包。 (2)优点: 1).存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2).当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。 3).存储过程可以重复使用,可减少数据库开发人员的工作量。 4).安全性高,可设定只有某用户才具有对指定存储过程的使用权。 13.如何调用存储过程 两种方式: 1、指令方式->exec存储过程名称; 2、使用PL/SQL块调用 begin 存储过程名称; end; 14带参数的存储过程语法? 两大类: a)带输入参数 b)带输出参数 a)带输入参数的存储过程 语法: createorreplaceprocedure存储过程名称(参数名称1in类型,....,参数名称n类型) as PL/SQL块 b)带输出参数的存储过程 语法: createorreplaceprocedure存储过程名称(参数名称1out类型,....,参数名称nout类型) as PL/SQL块 15.触发器的语法及案例? 当需要级联操作的时候可能用到触发器 语法: createorreplacetrigger触发器名称 before|afterinsertorupdateordelete[of字段名称]on表 begin PL/SQL语语句 案例: 当对Emp进行CUD操作时候做相应的输出信息。 createorreplacetriggertri_emp afterinsertorupdateordeleteonemp begin ifinsertingthen dbms_output.put_line('addisok'); elsifupdatingthen dbms_output.put_line('updateisok'); else dbms_output.put_line('deleteisok'); endif; end; 二、基本SQL语句(39道) 1.向DEPT表插入新的部门(‘50’,‘MANAGEMENT’,‘BEIJING’)并显示; INSERTINTOdeptVALUES('50','management','beijing'); SELECT*FROMdeptWHEREdeptno=50; 2.将部门号为‘50’的地址改为‘SHANGHAI’,再执行一次回滚,而后提交; UPDATEdeptSETloc='shanghai'WHEREdeptno=50; ROLLBACK; COMMIT; SELECT*FROMdeptWHEREdeptno=50; 3.统计各部门工资的平均值; SELECTdeptno,AVG(sal)FROMempGROUPBYdeptno; 4.查询SMITH上级领导的姓名; SELECTmgrFROMempWHEREename='smith'; 5.查询工资高于JONES的所有员工的姓名和工资; SELECTename,salFROMempWHEREsal>(SELECTsalFROMempWHEREename='jones'); 6.按员工的工资划分等级,工资高于2500的为A等,在1500和2500间(包括1500及2500)为B等, 其余为C等(提示: 增加新列DJ); altertableempaddDJvarchar (1); UpdateempsetDJ=casewhensal>2500 then'A' whensal<1500 then'C' else'B' end; 7.查询和ALLEN不在同一部门的员工姓名和所在部门名称; SELECTemp.ename,dept.dname FROMemp,dept WHERE emp.deptnonotin(SELECTemp.deptnoFROMempWHEREename='allen')ANDemp.deptno=dept.deptno; 8.用UNION查询工资高于1500并且在30号部门工作的员工号,员工名,工资; SELECTempno,ename,salFROMempWHEREsal>1500anddeptno=30; UNION SELECTempno,ename,salFROMempWHEREsal>1500anddeptno=30; 9.按照员工的部门号升序排列,同部门的再按员工工资降序排列; SELECTdeptno,salFROMempORDERBYdeptno,saldesc; 10.查工资不超过2000的员工所有信息。 SELECT*FROMempWHEREsal<=2000; 11.使用groupby进行单列分组: 显示每个部门的平均工资和最高工资 SELECTdeptno,AVG(sal),MAX(sal)fromempGROUPBYdeptno; 12.使用groupby进行多列分组: 显示每个部门每种岗位的平均工资和最高工资 SELECTdeptno,job,AVG(sal),MAX(sal)FROMempGROUPBYdeptno,job; 13.使用having子句限制分组显示结果: 显示平均工资低于2000的部门号、平均工资及最高工资 SELECTdeptno,AVG(sal),MAX(sal)FROMempGROUPBYdeptnoHAVINGAVG(sal)<2000; 14.相等连接(emp和dept表,emp.empno,ename,dname字段) selectemp.empno,ename,dnamefromemp,deptwhereemp.deptno=dept.deptno; 15.内连接(emp和dept表,emp.empno,ename,dname字段)) selectempno,ename,dnamefromempinnerjoindeptonemp.deptno=dept.deptno; 16.左外连接(emp和dept表,emp.empno,ename,dname字段)) selectempno,dept.deptnofromempleftjoindeptonemp.deptno=dept.deptno; 17.右外连接(emp和dept表,emp.empno,ename,dname字段)) selectempno,dept.deptnofromemprightjoindeptonemp.deptno=dept.deptno; 18.求-12.01的绝对值。 selectabs(-12.01)fromdual; 19.求小于15.6的最大整数。 selectfloor(15.6)fromdual; 20.11除以4的余数。 selectmod(11,4)fromdual; 21.求-2的3次方和2的-1次方; selectpower(-2,3),power(2,-1)fromdual; 22.12.666四舍五入到小数点后一位。 selectround(12.666,1)fromdual; 23.查询a和A的ASCII码值。 selectascii('a')"a",ascii('A')"A"fromdual; 24.查ASCII码值为56的字符。 selectchr(56)fromdual; 25连接Good和Morning两个字符串。 selectconcat('Good','Morning')fromdual; 26找h在hello中的位置。 selectinstr('hello','h')fromdual; 27示正好为5个字符的员工的姓名. selectenamefromempwherelength(ename)=5; 28.缺省值为20'字符串中的'缺省'替换为'默认'。 selectreplace('缺省值为20','缺省','默认')fromdual; 29.hello中取第一个字符到第三个字符的字符串。 selectsubstr('hello',1,3)fromdual; 30.求14个月前的时间。 selectadd_months(sysdate,-14)fromdual; 31.查询现在的日期时间。 selectcurrent_datefromdual; 32.查询当前会话的日期时间。 selectcurrent_timestampfromdual; 33.查询1998年8月31号到现在有多少个月。 selectmonths_between(sysdate,'31-8月-1998')fromdual; 34.查询现在时间。 selectsysdatefromdual; 35.查询当前系统日期时间及时区。 selectsystimestampfromdual; 36.将系统当前时间转换为字符型。 selectcast(sysdateasvarchar2(20))fromdual; 37.将'中国'从'US7ASCII'转化为'WE8ISO8859P1'字符集。 selectconvert('中国','US7ASCII','WE8ISO8859P1')fromdual; 38.将当前时间转换成字符型。 selectto_char(sysdate)fromdual; 39.讲字符串'05-9月-11'转化为日期型。 selectto_date('05-9月-11')fromdual; 三、视图(5道) 1建立一个最简单的视图 createviewdept_20as(select*fromscott.emp_dllwheredeptno=20) createviewjob_clerkas(select*fromscott.emp_dllwherejob='CLERK') 2使用视图dept_20和job_clerk取得部门20或岗位为CLERK的所有雇员名、工资(不显重复值) selectename,salfromdept_20 union selectename,salfromjob_clerk; 3使用视图dept_20和job_clerk私利部门20或岗位为CLERK的所有雇员名、工资(显示重复值) selectename,salfromdept_20 unionall selectename,salfromjob_clerk; 4使用视图dept_20和job_clerk取得部门20并且岗位为CLERK的所有雇员名和工资 selectename,salfromdept_20 INTERSECT selectename,salfromjob_clerk; 5使用视图dept_20和job_clerk取得部门20但岗位不是CLERK的所有雇员名和工资 selectename,salfromdept_20whereempnonotin(selectempnofromjob_clerk) 四、存储过程和函数(7道) 1。 编写一个函数,计算scott.emp表中工资总和(工资在1500以内的涨200,1500-3000的涨300,3000以上的涨400); createorreplacefunctiontotal_salreturnnumberas v_totalnumber; anumber; bnumber; cnumber; begin selectcount(*)intoafromempwheresal<1500; selectcount(*)intobfromempwheresalbetween1500and3000; selectcount(*)intocfromempwheresal>3000; selectsum(sal)intov_totalfromscott.emp; v_total: =a*200+b*300+c*400+v_total; returnv_total; endtotal_sal; selecttotal_salfromdual; TOTAL_SAL ---------- 32725 2。 编写一个存
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 试题