数据库笔试题
姓名 日期
一、选择题
1、当你执行一下查询语句:SELECT empno, ename FROM emp WHERE empno=7782 OR empno=7876; 在WHERE语句中,以下哪个操作符可以取代OR? A
A IN
B BETWEEN …闭区间
C LIKE
D <=
2、哪个实现IF…THEN …ELSE 逻辑?C
A INTCAP() 首字母大写
B REPLACE()
C DECODE()
D IFELSE()
3、当一个程序执行了SELECT … FOR UPDATE 语句,以下哪个步骤必须需要完成? A
A 执行COMMIT 或ROLLBACK 结束 TRANSACTION,即使并没有数据改变
B 如果有数据改变,则需要执行COMMIT 或 ROLLBACK来结束TRANSACTION 不全面
C 由于只有数据确实改变后,一个TRANSACTION 才会开始,所以现在不需要COMMIT
或ROLLBACK 被执行 说错了
4、以下哪个命令可以被用来从表STATE 中 DROP 列 UPDATE_DT ? A
A ALTER TABLE STATE DROP COLUMN UPDATE_DT;
B ALTER TABLE STATE REMOVE COLUMN UPDATE_DT;
C DROP COLUMN UPDATE_DT FROM STATE ;
D 你不能从这个表中DROP 该列
5、下列哪个函数不可以将NULL值转换为实际值 D
A NVL
B NVL2
C NULLIF[Oracle NULLIF函数
语法为NULLIF(表达式1,表达式2),
如果表达式1 = 表达式2则返回空值,
如果表达式1 !=表达式2则返回表达式1的结果。]
D TO_NUMBER 会报错
6、当两位用户中的每一位都对一个单独的对象进行了锁定,而他们又要获取对方对象的锁
时,将会发生? 两人是交叉的访问 B
A 共享锁[共享锁(S,读锁): 只读,不能修改,即允许多个事务对某个数据同时获得S锁读权限,且无法添加X锁修改数据!
]
B 死锁
C 排他锁[排他锁(X,写锁):某数据被T1加X锁,不再允许其他事务对其进行任何锁处理(直到T1释放X锁),仅有事务T1能对数据可读可修改,其他事务无读写权限; ]
7、DBMS_LOB 数据包提供的,返回LOB值的长度 D
A LENGTH
B SUBSTR
C INSTR
D GELENGTH
8、PL/SQL为内存耗尽时,预定义了( ) 异常 B
A NO_DATA_FOUND
B MEMORY_ERROR
C STORAGE_ERROR 硬盘问题
D NO_MOMORY_FOUND
9、在创建序列的过程中,下列哪个选项指定序列在达到最大值或最小值后,将继续从头开
始生成值 A
A CYCLE 循环
B NOCYCLE
C CACHE 缓存
D NOCACHE
10、下列有关包的使用说法错误的是 D
A 在不同的包内模块可以重名
B 包的私有过程不能被外部程序调用 Java里的
C 包体中的过程和函数必须在包头部分说明
D 必须先创建包头,然后创建包体
11、在ORACLE中,需要( ) 权限来调用其他用户产生的函数 D
A 函数中使用的表格的select权限
B 函数中使用的表格的execute权限
C 函数的execute权限
D 函数中使用的表格的select权限和函数的execute权限
12、在ORACLE中,ORDER BY 子句中 ( )关键词是用于从高到低的显示数字型列值的 D
A AS
B ASC 正序,默认
C INTO
D DESC 倒序
E BETWEEN…AND
13、在ORACLE中,雇员信息表的主键是雇员号,部门信息表的主键是部门号,在下列所给的
操作中哪项内容不能执行 D
雇员信息表 部门信息表
雇员号 雇员名 部门号 工资
001 张三 02 2000
010 王宏达 01 1200
066 马林 02 1000
101 赵敏 04 1500
部门号 部门名 主任
01 业务部 李建
02 销售部 英东
03 服务部 周银
04 财务部 陈胜利
A 从雇员信息表中删除行(’010’,’王宏达’,’01’,’1200’)
B 将行(’102’,’赵敏’,’01’,’1500’)插入到雇员信息表中
C 将雇员信息表中雇员号为’010’的工资改为1600
D 将雇员信息表中雇员为’010’的部门改为’05’
14、在ORACLE 中,使用HAVING子句也可以进行条件查询,所以以下选项中说法是正确
的 B
A HAVING子句和WHERE子句相同
B HAVING 子句用于已分组结果的条件查询
C HAVING 子句用于行的条件查询 where
D 以上皆非
15、ID是表TABLE1的主键,则我们可以确定 A
A TABLE1 只有ID 一个主键
B 数据库范围内其他表都不可以用ID 为主键
C ID必定为某张表的外键
D 以上皆非
二、简答题
1、查找oracle数据库中(表t)被哪些对象使用:
select * from user_dependencies
where referenced_name = ’t’
and referenced_type = ‘TABLE’
2、根据ID删除表中重复记录:
delete from 表 t1 where t1.rowid <
(select max(rowid) from 表 t2 where t1.id = t2.id)
3、表t有若干列(id,name,…,value),存放数据5000万,用最优的方法把value处理为value*(0.1-1)之间的随机数
create table 表_bak as
select id,name,…,value * round(dbms_random.value(0.1,1),1) from 表;
truncate table 表;
insert into 表 select * from表_bak;
commit;
4、根据表t(code,pcode)中的pcode递归查询获取所有子节点,已知pcode=’A’
递归的写法
select * from t
start with t.pcode = ‘A’
connect by t.parent = prior t.code
5、观察下表,用sql语句实现下列结果
原表结构 目标结构
Id Value1 Value2 Value1 Value2
100001 10 10 9.9 10.1
100001 10 10 9.8 10.2
100002 20 20 20.1 19.9
100002 20 20 20.2 19.8
100003 30 30 29.9 30.1
100003 30 30 29.8 30.2
100004 40 40 40.1 39.9
100004 40 40 40.2 39.8
奇数部分 减去 0.1 0.2
偶数部分 加 0.1 0.2
第一行减去0.1 第二行减去0.2
Select id ,
value1 – decode(mod(id,2),1,1,-1)[Case when 值除以2
没有余数 就是偶数就是 -1
有余数 就是 奇数就是 +1
Case when mod(id,2) = 0 then -1 else 1 end
Value1 + Power(-1,value1/10)
Value2 - Power(-1,value1/10)
]*(row_number() over(partition by id order by id)/10) ,
value2 + decode(mod(id,2),1,1,-1)(row_number() over(partition by id order by id)/10) from 表
6、已知“ab+ab=bcc”,用一句sql实现a,b,c的对应值(0…9的数字)
A 是十位的 B 是个位数的
select t1.a ,t2.b, t3.c from
(select rownum - 1 as a from scott.emp where rownum <=10) t1 ,
(select rownum - 1 as b from scott.emp where rownum <=10) t2,
(select rownum - 1 as c from scott.emp where rownum <=10) t3
where t1.a10 + t2.b + t1.a10 + t2.b = t2.b100 + t3.c10 + t3.c
7、一组通话记录如下:
ID 主叫号码 被叫号码 通话起始时间 通话结束时间 通话时长
1 98290000 021546654665 2007-02-01 09:49:53.000 2007-02-01 09:50:16.000 23
2 98290000 021546654666 2007-02-01 09:50:29.000 2007-02-01 09:50:41.000 12
3 98290000 021546654666 2007-02-01 09:50:58.000 2007-02-01 09:51:12.000 14
4 68290900 075513332986 2007-02-01 10:04:31.000 2007-02-01 10:07:13.000 162
5 78290000 075525570863 2007-02-01 10:48:26.000 2007-02-01 10:19:23.000 57
6 78290000 035730928370 2007-02-01 10:49:39.000 2007-02-01 10:52:55.000 196
7 78290000 087113888990 2007-02-01 11:30:45.000 2007-02-01 11:31:58.000 73
8 78290000 035730928379 2007-02-01 11:33:47.000 2007-02-01 11:35:00.000 73
9 68290000 075582111910 2007-02-01 11:52:20.000 2007-02-01 11:54:56.000 156
10 68290000 029852181119 2007-02-01 12:44:45.000 2007-02-01 12:45:04.000 19
求其中同一个号码的两次通话之间间隔大于10秒通话记录ID
例如:6,7,8,9,10条记录均符合
用两次该表
t1表示第一行数据
t2表示第二行数据
判断第一行的结束时间和第二行开始时间之间的间隔
select * from 表 t1 ,
表 t2
where t2.通话起始时间 - t1.通话结束时间> 10
and t1.主叫号码 = t2.主叫号码
and t2.id = t1.id +1
8、表T(bbq时间,rg_code行政区划,code预算科目,amt金额),以时间bbq(“yyyymmdd”)格式存储,用最优语句计算每个地区每个预算科目的日数据,月累计和年累计
select rg_code ,code,bbq, day_amt,
sum(day_amt) over(partition by rg_code ,code,substr(bbq,1,6)) as 月累计,
sum(day_amt) over(partition by rg_code ,code,substr(bbq,1,4)) as 年累计
from
(select rg_code ,code,bbq,sum(amt) as day_amt
from T
group by rg_code ,code, bbq );----要得到日数据 就可以按时间分组
9、请写出一条sql语句,查询出在此期间连续3年纳税金额大于等于2000万的企业有哪些,其连续的年份的起止时间是多少,平均纳税金额是多少,结果如下:
YEAR ENT AMT
2010 AA 2000
2011 AA 2500
2012 AA 2300
2013 AA 1900
2014 AA 2200
2015 AA 2300
2016 AA 2006
2010 BB 2400
2011 BB 2401
2012 BB 1800
2013 BB 2100
2014 BB 2101
2015 BB 2102
2016 BB 2020
企业名称 开始时间 结束时间 平均纳税
AA 2010 2012 2266.7
AA 2014 2016 2168.7
BB 2013 2016 2080.8
Select distinct ent , min_year, max _year, ,amt_total/num
from
(Select ent,min(year) over(partition by ent,ch) as min_year,
max(year) over(partition by ent,ch) as max _year,
sum(amt) over(partition by ent,ch) as amt_total,
count(*) over(partition by ent,ch) as num
from
( Select ent ,year ,amt ,
(year - row_number() over(partition by ent order by year)) as ch
from t
where amt>=2000)
)
where num = 3
10、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问某些月后兔子总数为多少?(要求过程实现输入任意时间得到相应的结果)
规律:
1 1 2 3 5 8 13 21 34 55 89 144 ….
按 每对兔子计算 前两个相加等于结果的第三个数值
create procedure tt (num number)
as
rab_num number(38):=1;
rab_midi number(38):=0;
rab_result number(38):=1;
begin
for x in 3…num loop
rab_midi= rab_result; —中间的那个容器
rab_result= rab_result + rab_num; —结果值放在前一个月的
rab_num= rab_midi;
end loop;
dbms_output.putline(rab_result);
end