Oracle面试题1

1、每一个用户有姓名、别名、性别、联系方式,但是联系方式有多种:

公司电话、手机、固定电话,

问:你怎样设计表结构
 **使用powerdesigner工具
 **引用设计范式1,2,3
 **设计两张表:tuser(#id,#name,#alias,#sex,#concatid)
        tconcat(#id,#tele,#phone,#telecompany)
        alter table tuser add constraint fk_concat foreign key(concatid) references tconcat(id);

2、内连接,左连接,右连接的区别
 **内连接:指主表,从表中符合连接条件的记录全部显示
 **左连接:外连接方式,主要是显示主表,从表中符合连接条件的记录,并且主表中所有不符合连接条件的记录也要显示。
 **右连接:外连接方式,主要是显示主表,从表中所有符合连接条件的记录,并且从表中不符合的记录也要显示。

3、存储过程 、函数 、游标 在项目中怎么用的
 **存储过程:能够批量执行的一组SQL语句,且容易控制事务。但没有返回值,可以通过设置in out|out类型的参数返回结果
 **函数:    与过程相似,返回值类型,并且语句中有返回语句return 变量;
 **游标:    是查询结果返回的结果集首地址指针。可以定义ref引用游标,依次取得记录并批量操作。

4、谈谈你了解的数据库,有没有写过存储过程?简单说一些sql优化。
 **mysql5,sqlserver2005,oracle9i,oracle10g,oracle11g,h2.
 **创建存储过程格式:create or replace procedure proc_XX(a number,b out varchar2,c in out varchar2) is 变量声明;begin  ...sql语句块;end;
 **查询操作尽量操作指定字段,条件设置时应从右到左,将明确的条件放置在右边,先执行。
   少用in ,is not null,is null等判断,尽量用exists,或=相应操作符。
   连接表查询时,以连接查询优先。少用子查询。
   适当用集合操作。

5、一张学生表,name,sex,id 查询男女的人数(一条sql)
 **select sex,count(id) 人数
   from student
   group by sex;

6、索引是用来干什么的,有那些约束建立索引。说下你怎么使用索引的?使用索引的好处和坏处?
 **索引用于对指定字段查询时,提升查询速度。
 **主要有B树索引,位图索引,函数索引。
 **对查询频率比较高的字段做索引,但一张表不要做太多索引。
 **索引能提升查询效率,但它占用存储空间,且在更新数据时也会影响更新效率。

7、你写过SQL优化?一个简单的SQL语句,数据量很大,只需要一两个字段你怎么来优化?select * from A where A.a='too';
 **在select 子句中取这两个字段,且设置查询范围条件。如果可能尽量用分页查询。
8、写一条删除重复的 sql语句?
 **delete from XXX where rowid <> all(select max(rowid) from XXX group by xx);
9、如果我要在控制台看到执行的SQL语句,我要怎么办?
 explain plan for select * from emp;--解释执行SQL语句
 select * from plan_table;--查询执行结果反馈信息
10、如果一张user_vip表有60条数据,请写出获取该表的28条数据语法?(分页)
 **
 1)用分析函数:
 select row_number() over(order by XXX asc) pageno, e.*
 from XXX e
 where e.pageno between 3 and 30;
        2)子查询实现:
 select *
 from (select rownum rn ,e.*
  from xxx e)
 where rn between 3 and 30;
11、请说出你所熟悉的数据库优化的方法有哪些?
   **硬件, 数据库服务器配置高级些,刀片内存。
   **软件,      设置共享池加大。数据库集群.
   **应用程序,  sql语句,
    查询操作尽量操作指定字段,条件设置时应从右到左,将明确的条件放置在右边,先执行。
    少用in ,is not null,is null等判断,尽量用exists,或=相应操作符。
    连接表查询时,以连接查询优先。少用子查询。
    适当用集合操作。
           采用视图查询来屏蔽安全要求级别较高的字段或表结构。
12、"SQL题: S(SNO,SNAME)学生表,C(CNO,TEACHER,课程字段)老师表,SC(SNO,CNO,成绩字段)成绩表

 1) 查询出没有上""李""老师的课程的学生?
 select s.sno,s.sname
 from s s ,sc sc,c c
 where s.sno=sc.sno and sc.cno=c.cno and c.teacher!='李';
2) 查询出学过课程""1""和""2""的学生?
 select  s.sno,s.sname
 from s ,sc,c
 where s.sno=sc.sno and sc.cno=c.cno and c.cno='1' or c.cno='2';
13、视图可以更新吗?写个示例。
 **可以,create or replace view v_test as select * from emp ,dept where emp.deptno=dept.deptno with check option;
14、存储过程是用来干什么的?
 执行批量操作,并控制事务,分解应用服务器的执行压力。达到代码复用。 

15、 Oracle数据库属于以下哪种数据库类型?(B)

A、网状数据库 B、关系数据库 C、层次数据库 D、面向对象数据库和关系数据库

16、"现有一个员工表,有一个结构和员工一样的员工一表,

1)怎么用一条SQL将员工表中的数据插入到员工一表中。
 insert into table1 select * from table2;

2)求员工人数大于3个人的部门。
 select deptno,count(rowid)
 from table1
 group by deptno having count(rowid)>3;

17、union 和 union all 的区别,画了两张表,如何用一条 SQL语句将记录全部查询出来
 **都是将两个结果集合一起
   union是两个结果集中的重复记录取一份。
   union all是不管重复与否,合一起。
18、"什么是事务
 **事务是一组相关的SQL语句,且为完成一个功能。
 主要四个特性:原子性,一致性,隔离性,持久性。

19、"有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条SQL语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
 
大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。

建表:
 create table score (
  chinese number(3),
  maths   number(3),
  english number(3));
数据准备:
 insert into score(chinese) values(70);
 insert into score(maths) values(80);
 insert into score(english) values(58);
查询语句实现:
case 字段  when  值  then  显示值 else 显示值默认 end--显示值切换.
case when 字段名<(比较运算符)条件值 then 显示值  else 显示值默认 end ---显示值切换。

select  case  when chinese>=80 then '优秀'
         when chinese>=60 then '及格'
       when chinese<60  then '不及格'
  else null   
  end     语文,
 case  when maths>=80 then '优秀'
         when maths>=60 then '及格'
       when maths<60  then '不及格'
     else null
  end     数学,
 case  when english>=80 then '优秀'
         when english>=60 then '及格'
       when english<60  then '不及格'
  else null
  end     英语
from score

20、查出表中的4—9条记录
 select row_nunber() over(order by sal asc) rn ,e.*
 from emp e
 where e.rn between 4 and 9;

21、查出两张表中相同的数据
 select * from table1
 intersect
 select * from table2;

22、表空间描述,及作用?
 tablespace  --表空间对应用户数据的存储,在创建用户时一般会指定表空间,如果没,默认为users.
      存储用户的所有对象。
       表空间包括:数据段segemnet --数据区extents --数据块data block,
       一个数据文件只能存储在一个表空间中。


23、锁是什么?
 **锁   主要行级和表锁。
  行级锁主要是在执行操作过程中,锁定指定的行。主要的锁行语句有:
   insert ,update,delete ,及select ....for update。
  表锁:指在运行操作指令过程中,由用户指定锁定某张表。
   lock table  XXX in mode share;--共享锁,
   共享锁,排他锁,共享排它,行共享,行排他。

24、存储过程的操作 当它抛出异常的时候 你是如何解决的用了什么技术
 **中止当前语句执行,转到exception语句块执行。
 **在异常处理时,捕获相应异常,并执行对应解决方案语句。

25、写个SQL:在某一时间里,某个用户,对访问次数最多的IP作查询


 select username ,ip,count(rowid) coun
 from t
 where t.starttime between sysdate-30 and sysdate
 group by username,ip 
 having count(rowid)=(select max(count(rowid)) from t where t.starttime between sysdate-30 and sysdate
 group by username,ip );
 
 

26、说明数据分页的原理,作用,写条sql分页。
 **oracle数据分页按应用需求,来获取相应的记录数,并展示给用户。
  可以使用伪例rownum作子查询,或使用分析函数row_number()来实现查询语句。
 **提升系统的性能,查询速度。
 **rownum子查询:
  select *
  from (select rownum rn ,t.* 
   from table t)
  where rn between startpage and endpage;
   分析函数实现:(分析函数执行结果也不能直接用于查询条件限制)
  创建视图:
  create view v_xx as 
   select row_number() over (order by t.XXX)  as rn,t.*
   from table t
   where t.rn between startpage and endpage;
  查询视图: select * from v_xx where rn between startpage and endpage;

**用集合操作方式实现:

select * from XXX where rownum<=90   minus  select * from XXX where rownum<=80;

这样就能得到第80条到90条的中间共10条记录.

27、"笔试题目:有个SQL

球队 得冠军的年份

湖人 1990

老鹰 1991

湖人 1992

热火 1993

老鹰 1994

    热火 1995

要求用你自己的方式写出:

 1)球队 最开始得冠军的年份 最后得冠军的年份

    湖人 1990               1992"

 select team,min(year) ,max(year)
 from t
 group by team;

28、SQL题目(经典的学生表和成绩表)

    1000万的表加多个外关联表!怎么优化SQL,短时间查询出来!

 **查询业务相关字段,并设置分页。
   然后再作连接。
   限制条件中再加入索引查询。

29、truncate,delete,drop的区别?
 **truncate 截断表中的数据,是物理删除表中所有记录,且不能回滚。
 **delete 是DML语句中的删除,逻辑删除表中符合条件的记录,能回滚。
 **drop是DDL语句,删除表名或其它对象名,也可删除指定表中的字段。

30、"数据库

    Student(S#,Sname,Sage,Ssex) 学生表

    Course(C#,Cname,T#) 课程表

    SC(S#,C#,score) 成绩表

    Teacher(T#,Tname) 教师表

    1)查询""001""课程比""002""课程成绩高的所有学生的学号;

        select a.S#from (select s#,scorefrom SCwhere C#='001') a,(select s#,score

        from SCwhere C#='002') b

        where a.score>b.scoreand a.s#=b.s#;

    2)查询平均成绩大于60分的同学的学号和平均成绩;

        select S#,avg(score)

        from sc

        group by S#having avg(score) >60;

    3)查询姓""李""的老师的个数;

        select count(distinct(Tname))

        from Teacher

        where Tname like '李%';"

31、数据库A表和B表的结构是一样的,怎么把A中的数据全部复制到B重,而且要去重复.
 **
    去除重复:select * from a minus select * from b;
 **
    插入:insert into b (select * from a minus select * from b);

 或:insert into b (select * from a where a.id !=all(select id from b));

32、一张表中的重复字段你怎么去掉重复,有几种方式。
 **表结构调整语句:
  alter table xxx drop column 字段名;

33、表table_name结构和数据,请用一条SQL语句查询出每门课程大于80分的学生姓名
 学生表:student(#sid,#name)
 成绩表: score(#id,#sid,#cid,#score)
 课程表:course(#cid,#cname)

 select sc.sid,s.name,count(sc.cid) coun
 from score sc,student s
 where sc.sid=s.sid and score>80
 group by sid having count(cid)=3;
 
 
 

34、查询登录表中近期登录的用户信息,一个用户只能查询出一条最近的记录"
 select username,max(logintime)
 from tuser
 group by username;

35、"有两张表:

    部门表department 部门编号dept_id 部门名称dept_name


    员工表employee 员工编号empid 员工姓名e_name 部门编号dept_id 工资e_wage

根据下列题目写出sql:

    1)、列出工资大于7000的员工所属的部门编号
 select d.dept_id,d.dname,e.ename
 from employee e,department d
 where e.dept_id=d.dept_id and e.e_wage>7000;

    2)、列出员工表中的部门名称(左连接)
 select d.dept_id,d.dept_name
 from department d,employee e
 where d.dept_id=e.dept_id(+);

    3)、列出员工少于3人的部门编号
 select e.dept_id,count(e.rowid)
 from employee e
 group by e.dept_id having count(e.rowid)<3;
    4)、列出工资最高的员工姓名
 select e.e_name,e.e_wage
 from employee e
 where e.e_wage=(select Max(e_wage) from employee);

    5)、求各部门的平均工资
 select d.dept_id,avg(e.e_wage)
 from department d,employee e
 where d.dept_id=e.dept_id 
 group by d.dept_id;

    6)、求各部门的员工工资总额
 select d.dept_id,sum(e.e_wage)
 from department d,employee e
 where d.dept_id=e.dept_id 
 group by d.dept_id;

    7)、求每个部门中的最大工资值和最小工资值,并且它的最小值小于5000,最大值大于15000
 select d.dept_id,max(e.e_wage) ,min(e.e_wage)
 from department d,employee e
 where d.dept_id = e.dept_id
 group by d.dept_id having min(e.e_wage)>5000 and max(e.e_wage)<15000;
    8)、假如现在在库中有一个和员工表结构相同的空表employee2,请用一条sql语句将employee表中的所以记录插入到employee2表中。"
 insert into employee2 select * from employee;
36、"一个表中有A,B,C三个字段,如果A大于B就显示A,否则就显示B,如果B大于C就显示B, 否则显示C,用sql如何实现? "
 select case when a>b then a
      when b>c then b
      else c end
 from XXX;

37、delete和Truncate的区别。
 **delete 是逻辑删除指定条件的记录,可用rollback回滚操作恢复被删除记录。
 **truncate是物理删除,且删除表中所有记录。

38、Oracle 上亿条数据的时候如何优化数据库
 **将数据分表存放,可以依据某个特定的字段值,来划分生成对应的多张表,将相应值记录分别存放。
   必要时先建立表分区。
   如果数据字段多,也应考虑表的纵向划分,将按业务字段相关分成两张表或多张表。

39、Oracle的游标在存储过程里是放在begin与end的里面还是外面?Oracle的存储过程跟函数你写没有?项目中用到没有?怎么用的?
 **放在begin与end之间。
 **用作多表连接查询数据返回结果查询。
   复杂的业务操作,涉及多表的数据操作的事务控制。
   预防SQL注入。

40、写一个Oracle的jdbc连接,并写一条查询语句?Oracle中有几十万条数据时查询时怎么提高效率

 **
 Class.forName("oracle.jdbc.driver.OracleDriver");
 Connection conn = DriverMannager.getConnection("jdbc.oracle.thin:@主机名/1521/用户模式名","用户名","密码");
 Statement st = conn.createStatement("select * from emp");
 ResultSet rs = st.executeQuery();
 ...
 ** 作分页查询。查询条件设置时尽量用上索引。避免全表扫描。

41、怎么来查看数据库时区,查询当前用户的会话时区?

 CURRENT_DATE:为数据库会话设置的本地时区中的当前日期时间
 DBTIMEZONE:获取数据库的时区
 SESSIONTIMEZONE:获取与当前数据库会话的时区


42、解释数据块(data block),区(extent) 和数据段(segment)的区别?

 **数据块是数据库中最小的逻辑存储单元。
 **多个连续的数据块组成区。
 **一个数据库对象拥有的所有区(extents)被称为对象的数据段
43、实现索引的方式?索引的原理?索引的代价?索引的类型?
 **实现方式:
  1)针对一张表的某些字段值创建,
  2)在创建表时主动为主键及唯一约束字段建立索引。
 **原理:
  根据建立索引的字段建立索引表,存放字段值以及对应记录的物理地址
  从而在搜索时根据字段值直接访问记录的物理地址。
 **代价:
  引入索引虽然提升了查询速度,但索引本身也占用了一定的系统存储空间
         和系统处理时间,所以应根据具体情况而定索引。
 **类型:
  B树索引,位图索引,函数索引。
44、使用存储过程访问数据库比直接用SQL语句访问有何优点?
 **存储过程是预编译过的,执行时不须编译,执行速度更快。
   存储过程封装了多条SQL,便于维护数据的完整性与一致性。
   实现代码复用。
45、对oracle系统,描述SGA的结构,后台进程中PMON,CKPT,LGWR,SMON等进程的功能,并且
    表空间的分配策略。
 **SGA:
  全名为系统全局区,包括有:数据缓存区,日志缓存区,共享池,大池等。
  数据缓存区:用于存放最近使用过的数据块,包括与后台进程中DBWR有关系的数据。
  日志缓存区:存放操作数据库数据所产生的日志信息,并且与LGWR有关的日志文件信息。
  共享池: 主要缓存SQL,PLSQL块,资源锁及控制信息等。保存一些绑定变量,会话参数及语法分析结果,执行计划。

 **后台进程:
  数据库读写进程:(DBWR)主要对数据库缓存区中的脏冷数据进行写入数据文件操作。
  日志读写进程:  (LGWR)主要对数据库操作产生的重做日志信息写入重做日志文件。
  系统监视进程:  (SMON)完成由非正常关闭数据库下重起数据库时对数据库的恢复。
  进程监视进程:  (PMON)用于恢复失败的用户进程和服务器进程,并释放其所占用系统资源。
  检查点进程:    (CKPT)表示这个点的数据库处于完整状态。
 **存储空间:
  逻辑结构:
     数据块 data block,
     区  extent,
     段  segment,
     表空间 tablespace (从上到下,空间存放内容逐渐增大)create tablespace myspace datafile 'e:a.ora'  size 10M ;
  物理存储:
   数据文件,
   控制文件,
   日志文件
46、oracle中的回滚的概念?回滚段作用。
 **回滚:指在事务提交之前将数据库数据恢复到事务修改之前的数据库数据状态。
  可以回滚到savepoint 指定的回滚点。
 **回滚段:
  为回滚提供依据,记录事务操作数据库之前的数据或对应于以前操作的操作。
47、简述oracle的归档与非归档工作模式。

 **归档:
  指在创建数据库时指定了archivelog参数,当重做日志文件写满时会将该重做日志文件的内容保存到指定的位置(由初始化文件中的参数archive_log_dest_n来决定)
  并不是数据库在归档模式下工作时就可以完成归档操作,在归档模式下可以有自动归档(在初始化文件中的参数archive_log_start设置为true)和手动归档
  如果归档下没有启动自动归档,手动又没有进行,那么当LGWR进程将重做日志写入已经写满的重做日志文件时,数据库会被挂起直到进行归档。
 **非归档:
  指当重做日志文件写满后,若有日志写入操作时,以前保存在重做日志文件中的信息就会被覆盖。

原文地址:https://www.cnblogs.com/t0404/p/10291024.html