oracle sql 语句 面试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle sql 语句 面试题相关的知识,希望对你有一定的参考价值。

自己做了几个题 不知对错,请大家帮忙看看。
对于教学数据库的三个表:
学生表 S(S#,SNAME,AGE,SEX)
选课表 SC(S#,C#,GRADE)
课程表 C(C#,CNAME,TEACHER)

(1)统计有学生选修的课程门数
select count(c#)
from SC where s# <> null

2)求选修C4课程的女学生的平均年龄
select avg(age) from
(
select s# from s join
(select s# from sc where c# = c4) t on (s.s# = t.s#) where sex = 'nv'
)

3)求刘老师所授的课程的每门课程的平均成绩
select cname , avg(grade) from sc , c
where c.teacher =' liu' and sc.c# = c.c#
group by c#

(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求显示课程号和人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。

select c#, count(s#) counnt_s from s,sc
where s.s# = sc.s# group by c# having count(s#) >10
order by count_s,c#

对于教学数据库的三个表:
学生表 S(S#,SNAME,AGE,SEX)
选课表 SC(S#,C#,GRADE)
课程表 C(C#,CNAME,TEACHER)
5)检索学号比王军同学大,而年龄比他小的学生姓名
select s# from
(select s# from s where s. s# >'wang'.s# ) where
s.age > 'wang'.age

6)求年龄大于女同学平均年龄的男学生的姓名和年龄

select sname,age from s
where age>
(select avg(age) from s where sex = 'nv') and sex = 'nan'

7)求年龄大于所有女同学年龄的男学生的姓名和年龄
select sname ,age from s
where age>(select max(age) from s where sex = 'nv') and sex = 'nan'

(1)统计有学生选修的课程门数
select count(distinct c#) from SC

2)求选修C4课程的女学生的平均年龄
select avg(s.age) --最好都带上前缀,养成好习惯
from s,c,sc where s.s#=sc.s# and c.c#=sc.c#
and c.cname=\'C4\' and s.sex=\'女\'--字符类型带引号,必须注意大小写,你那么写好麻烦

3)求刘老师所授的课程的每门课程的平均成绩
select c.cname , avg(grade) from sc , c
where c.teacher =\' liu\' and sc.c# = c.c#
group by c.cname --select后是什么字段,这地方你也得最少有这个字段

(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求显示课程号和人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。

select t.*
from
(select sc.c#, count(s#) counnt_s from s,sc where s.s# = sc.s# group by sc.c# having count(s#) >10) t
order by counnt_s desc,c# asc --你排序不对,另外oracle不可根据别名排序,只可再做嵌套

5)检索学号比王军同学大,而年龄比他小的学生姓名
select a.s#
from
(select s# from s where s#>(select s# from s where sname=\'王军\') a,
select s# from s where age>(select age from s where sname=\'王军\') b
where a.s#=b.s#

6)求年龄大于女同学平均年龄的男学生的姓名和年龄

select sname,age from s
where age>
(select avg(age) from s where sex = \'nv\') and sex = \'nan\' --没问题

7)求年龄大于所有女同学年龄的男学生的姓名和年龄
select sname ,age from s
where age>(select max(age) from s where sex = \'nv\') and sex = \'nan\' --没问题
参考技术A --把这两个表id查出来组成一个记录集SELECT id FROM emp1 UNION ALL SELECT id FROM sext ------------------id1234145--上面的记录集取别名为t 根据这个t 的id等于emp1的id的条件查出t中记录数小于2的emp1记录SELECT * FROM emp1 e WHERE (SELECT COUNT(*)FROM (SELECT id FROM emp1 UNION ALL SELECT id FROM sext) tWHERE t.id = e.id) < 2---------------------------id name2 b3 c
希望对你能有所帮助。
参考技术B Oracle中,NULL最好是is or is not
其他的答案差不多,没具体看

Oracle面试题

1.rowid、rownum的定义

答:rowid是物理地址,是用于定位数据表中数据存储的位置,唯一的,不会改变

rownum是SQL输出结果的排序,同一条记录不同查询条件对应的rownum也会不同

 

2.Oracle中function何procedure的区别?

答:function是函数,procedure是存储过程,函数有1个返回值,存储过程有多个或者没有;函数可以在查询语句中调用,而存储过程只能单独调用;

 

3.Oracle的导入导出有几种方式,有何区别?

1)dmp文件方式
描述:dmp文件是二进制的,可以跨平台,并且包含权限,支持大字段数据,是用的最广泛的一种。

导出语法:exp 用户名/密码@监听器路径/数据库实例名称 file=e:数据库文件.dmp full=y ignore=y ;其中full = y ,表示整个数据库操作; ignore=y,忽略错误,继续操作;
重点内容
导出举例:exp jojo/[email protected]/my_database file=e:my_database.dmp full=y ignore=y

导入语法:imp 用户名/密码@监听器路径/数据库实例名称 file=e:数据库文件.dmp full=y ignore=y ;

导入举例:imp jojo/[email protected]/my_database file=e:my_database.dmp full=y ignore=y

2)sql文件方式
SQL文件可用文本编辑器查看,有利于可读性,但效率不如dmp文件,适合小数据量导入导出。尤其注意的是表中不能有大字段(blob,clob,long),如果有,会提示不能导出(提示如下: table contains one or more LONG columns cannot export in sql format,user Pl/sql developer format instead)

3)pde文件
第三种是导出为pde格式,pde格式是PL/SQL 自带的文件格式,且且适用于PL/SQL工具,编辑器无法查看,一般不常用。

 

4.Oracle数据库sql查询把数据为空的项显示为0,用sql查询表示?

答:select decode(name,NULL,0,name) from table;

 

5.truncate和delete命令的异同?

答:truncate是DDL,隐形提交,不能回滚,delete是DML,每次删除都有记录;

执行速度上truncate>delete;

truncate是通过释放数据页来达到删除效果,所以日志文件只有一条删除记录,delete每删除一条就有一条记录;

 

6.数据库和数据仓库有什么区别?

答:数据库是面向事务,而数据仓库是面向主题的;数据库的设计是尽量避免冗余,因此符合范式,数据仓库反过来是尽可能引入冗余,利用反范式来设计;另外数据库面向的都是一些在线数据,数据仓库都是历史数据。还有之所以说数据仓库是数据库的升级优化版,是因为数据库是用来存放捕获数据,数据仓库在次基础上对数据进行分析。

 

7.Oracle中in与exists的区别?

答:exists返回的是一个布尔值,ture或false,in返回的是一个数据组吧。从查询效率角度分析,当外循环(主循环)返回的结果集大于子循环返回的结果值时,用in,反之用exists。

 

写一个存储过程,实现输入数字n,输出1到n的和

create procedure p(in n int,out result int)
begin
declace i int default 1;
declace sum int default 0;
while i<n
set sum=sum+i;
set i=i+1;     //如果奇数相加则i=i+2
end while
set result=sum;
end

 

用PL/SQL块实现在一个表中插入1000条数据,要求每100条提交一次

delimiter ||
create procedure p(in n int)
begin 
declare i int default 0; 
set i=0; 
lp:loop insert into kkk values(i+1); 
set i=i+1; 
if mod(i,10)=0 then 
commit; 
end if; 
if i=n then 
leave lp; 
end if; 
end loop; 
end||

 

有3个表 A(userid(用户ID),time(时间),fee(话费)),B(userid(用户ID),time(时间)),  C(userid(用户ID),fee(话费))各有1000万的数据, 3个表的userid是相同的,要求用B表的time字段,C表的fee字段更新A表的相应字段,用存储过程实现。

create procedure p1
cursor abc_cur is select b.userid,b.time,c.fee 
from b join c on b.userid=c.userid;
begin
for i in abc_cur loop
update a set a.time=i.time,a.fee=c.fee 
where a.userid=i.userid;
end loop;
end ||

 

有上百万数据用户表,删除其中的重复数据,保留最小id号

delete from kxf  k
where k.name in(select name from kxf group by name having count(*) >1) and
k.id not in (select min(id) from kxf froup by name);

 

用户资料表:serv( serv_id number(10), pro_id number(10), user_type varchar2(30), terminal_name varchar2(30) )

其中,serv_id 为用户标识,是serv表的主键,prod_id为产品标识;user_type为用户类型;terminal_name为终端类型

终端类型临时表:terminal(serv_id number(10),terminal_name varchar2(30))

初始化的情况下,serv表的serv_id,prod_id,user_type字段是已知的,terminal_name字段是空的

要求:根据prod_id,user_type字段的值来更新terminal_name字段

更新条件为:

当条件满足“prod_id = 1 and user_type=‘A‘“时,terminal_name更新为‘固话’

当条件满足”prod_id = 1 and user_type=‘B‘“时,terminal_name更新为‘小灵通’

当条件满足”prod_id = 2“时,terminal_name更新为‘宽带’

当条件满足”user_type=‘C’“时,terminal_name更新为‘CDMA’

以上条件均不满足时,terminal_name更新为 -1;

create procedure p 
is 
begin
update serv s
set s.terminal_name = case when prod_id=1 and user_type=A then 固话
                                           when prod_id=1 and user_type=B then 小灵通
                                           when prod_id=2 then 宽带
                                           when user_type=C then CDMA
                                    else -1 
                                    end;
update terminal a
set s.terminal_name = (select t.terminal_name 
                              from serv t
                             where t.serv_id = s.serv_id)
where exists (select x
                   from serv t
                   where t.serv_id = s.serv_id);
end;

 

以上是关于oracle sql 语句 面试题的主要内容,如果未能解决你的问题,请参考以下文章

oracle面试题

Oracle面试题

sql语句面试50题@20211219

面试题: 数据库 oracle数据库 未看6

sql面试题50题(mysql版)

sql面试题1