数据库笔试面试题汇总Word下载.docx
- 文档编号:16972660
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:15
- 大小:22.17KB
数据库笔试面试题汇总Word下载.docx
《数据库笔试面试题汇总Word下载.docx》由会员分享,可在线阅读,更多相关《数据库笔试面试题汇总Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
人员名称、部门名称、个人总工资
14.2查询所有部门的总工资
14.3查询2008年8月份各部门工资最高的员工信息:
部门名称、员工姓名、员工总工资
15、表warehousestorage
1.什么是第三范式(第一范式,第二范式。
第一范式:
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
第二范式:
如果关系模式R是1NF,且每个非主属性完全函数依赖于候选键,那么就称R是第二范式。
第三范式:
如果关系模式R是2NF,且关系模式R中的所有非主属性对任何候选关键字都不存在传递依赖,则称关系R是属于第三范式。
2.请说出delete,truncate,drop的区别
(1)delete和truncate区别:
delete:
从数据库的缓存区清除该数据
truncate:
把数据删除了,然后清空所占用的空间
delete可以撤销
truncate不能撤销
truncate===delete+commit
truncate和drop区别
drop:
删除表的定义,整个对象删掉,删除的是对象的本身,全部
删除表的内容,只是删除数据,表的结果会保留
3.怎么样查询特殊字符,如通配符%与_
select*fromtablewherenamelike'
A_%'
escape'
_'
4.如何插入单引号到数据库表中
可以用ASCII码处理,其它特殊字符如&
也一样,如:
insertintotvalues('
i'
chr(39)'
m'
);
--chr(39)代表字符'
或者用两个单引号表示一个
orinsertintotvalues('
I'
'
--两个'
可以表示一个'
5.怎么获得今天是星期几,还关于其它日期函数用法
(1)可以用to_char来解决,如:
selectto_char(to_date('
2002-08-26'
'
yyyy-mm-dd'
),'
day'
)fromdual;
(2)在获取之前可以设置日期语言,如:
ALTERSESSIONSETNLS_DATE_LANGUAGE='
AMERICAN'
;
(3)在函数中指定,如:
NLS_DATE_LANGUAGE=American'
(4)其它更多用法,可以参考to_char与to_date函数
如获得完整的时间格式
selectto_char(sysdate,'
yyyy-mm-ddhh24:
mi:
ss'
(5)随便介绍几个其它函数的用法:
本月的天数
SELECTto_char(last_day(SYSDATE),'
dd'
)daysFROMdual
今年的天数
selectadd_months(trunc(sysdate,'
year'
),12)-trunc(sysdate,'
)fromdual
下个星期一的日期
SELECTNext_day(SYSDATE,'
monday'
)FROMdual
6.知道出生日期,如何求年龄?
比如1984年1月23日出生,求现在的年龄:
Foolr()取比你输入的值小的最大的整数
Months_between()两个时间的之间的月数,而且这个数是一个浮点数724.XX
selectfloor(months_between(sysdate,birthday)/12)yyyy,
floor(months_between(sysdate,birthday)-floor(months_between(sysdate,birthday)/12)*12)mm,
trunc(sysdate)-add_months(birthday,floor(months_between(sysdate,birthday)))dd
fromdatetest;
selectname姓名,floor(months_between(sysdate,birthday)/12)岁fromperson;
selectname姓名,
floor(months_between(sysdate,birthday)-floor(months_between(sysdate,birthday)/12)*12)fromperson;
selecttrunc(sysdate,’yyyy’)fromperson;
selecttrunc(sysdate,’mm’)fromperson;
selecttrunc(sysdate)fromperson;
selecttrunc(sysdate)-add_months(birthday,floor(months_between(sysdate,birthday)))dd
fromperson;
7.求上个月月底的日期
现在时4月23求上个月的月底时几号?
(3月31日)
selectto_char(trunc(sysdate,'
MM'
)-1,'
YYYY-MM-DD'
selecttrunc(sysdate,’mm’)-1fromdual;
selectto_char()fromdual;
8.数据库类型中Varchar和char的区别是?
区别:
1.char的长度是固定的,而varchar2的长度是可以变化的,比如,存储字符串“abc"
,对于char(20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2(20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。
由于char是以固定长度的,所以它的速度会比varchar快得多!
但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!
2.CHAR的效率比VARCHAR2的效率稍高。
3.目前VARCHAR是VARCHAR2的同义词。
工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。
Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。
如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。
9.已知两张表:
人员表-----person
序号
字段名
中文说明
类型
可空
备注
1
ID
ID号
integer
N
PK
2
DEPT_ID
部门ID号
FK与部门表的ID对应
3
NAME
姓名
Varchar2(20)
4
SEX
性别
Char
(2)
默认为男,只能为男或女
5
BIRTHDAY
出生日期
Date
不能大于当前日期
6
WORK_YEARS
工龄
默认0
7
SALARY
工资
Number
默认1000.0
部门表---depart
Integer
DEPT_NAME
部门名称
DPET_TYPE
部门性质
Char
(1)
回答问题:
9.1按部门名称、人员性别分别统计人员数量。
部门名称:
selectdept_id,count(dept_id)人员数量frompersongroupbydept_id;
人员性别:
selectsex,count(sex)人员数量frompersongroupbysex;
9.2将进入公司年数在4年(含)以上的一线部门的女员工工资上调10%
updatepersonsetsalary=salary*1.1whereidin(selectperson.idfromperson,departwherework_years>
=4anddept_type='
1'
anddepart.id=person.dept_id);
9.3将性别为女,且进入公司年数少于2年的非一线部门人员记录删除
deletefrompersonwhereidin(selectperson.idfromperson,departwheresex='
Å
®
andwork_years<
2anddept_type!
='
10.数据库Teacher属性:
Select*fromstu2,teacherdwherestu2.related_id=teacherd.tidandteacherd.name='
\like'
转义字符
11.设有一个关系表Student(学号stu_id,姓名stu_name,系名stu_dept,课程号stu_courseid,成绩grade)
Select学号,姓名,avg(成绩)fromstudentgroupby学生编号,学生姓名havingcount(课程号)>
4;
selectstu_id,stu_name,avg(grade)fromstudenttgroupbystu_id,stu_namehavingcount(stu_courseid)>
第一步:
先求选修课程数小于5的学生的名字
Selectstu_namefromstudenttgroupbystu_namehavingcount(stu_courseid)<
5;
updatestudenttsetstu_name=stu_name||’#’wherestu_namein(selectstu_namefromstudenttgroupbystu_namehavingcount(stu_courseid)<
5);
updatestudenttsetstu_name=(trim(stu_name)||'
#'
wherestu_namein(
selectstu_namefromstudenttgroupbystu_namehavingcount(stu_courseid)<
12.用一条sql语句实现下面结果:
year
month
amount
1991
1.1
1.2
1.3
1.4
1992
2.1
2.2
2.3
2.4
查成这样一个结果
m1
m2
m3
m4
以下答案,表名都是Testcol。
(1)做法一:
selectyear,
max(decode(month,1,amount))asm1,
max(decode(month,2,amount))asm2,
max(decode(month,3,amount))asm3,
max(decode(month,4,amount))asm4
fromtestcol
groupbyyear;
(2)做法二:
selecta.yearyear,a.amountm1,b.amountm2,c.amountm3,d.amountm4fromtestcola,testcolb,testcolc,testcold
wherea.month=1andb.month=2andc.month=3andd.month=4anda.year=b.yearandb.year=c.yearandc.year=d.year;
(3)做法三:
selectyear,
(selectamountfromtestcolmwheremonth=1andm.year=testcol.year)asm1,
(selectamountfromtestcolmwheremonth=2andm.year=testcol.year)asm2,
(selectamountfromtestcolmwheremonth=3andm.year=testcol.year)asm3,
(selectamountfromtestcolmwheremonth=4andm.year=testcol.year)asm4
fromtestcolgroupbyyear;
(4)做法四
sum(casewhenmonth='
thenamountelse'
0'
end)asm1,
2'
end)asm2,
3'
end)asm3,
4'
end)asm4
13.有两个表T_STU表和T_CLASS表和一个序列sequence序列,T_STU表里有如下字段:
S_ID
S_NAME
S_SEX
S_BIRTHDAY
S_AGE
S_MOENY
C_ID
Dss
女
1980-5-10
30
2000.00
T_CLASS表里有如下字段:
C_NAME
理科重点
还有一个sequence序列:
seq_id
请完成如下的查询:
select*fromT_STU
where(S_AGEbetween18and20andS_SEX='
女'
)or(S_SEXisnull)
orderbyS_BIRTHDAY
或者:
orderby(sysdate-S_BIRTHDAY)desc
selectc.C_NAME,s.S_NAME,s.S_SEX,s.S_MOENY||'
元'
asS_MOENYfromT_STUs,T_CLASSCwheres.C_ID=c.c_id
orderbyc.c_id,s.S_NAME
selectc.C_NAME,count(*)asrs
fromT_STUs,T_CLASSC
wheres.C_ID=c.c_id
groupbyc.C_ID,c.C_NAME
selectc.C_ID,c.C_NAME,count(*)asrs
havingcount(*)>
=2
orderbycount(*)desc
select*fromt_stus
whereto_char(s.S_BIRTHDAY,'
yyyy'
)='
1980'
selectnvl(s.s_sex,1)asx,count(*)
fromt_stus
groupbynvl(s.s_sex,1)--必须把null值当作1来分组
易错:
selectnvl(s.s_sex,1)asx,count(*)--将null当作1来显示
groupbys.s_sex
效率低:
select*fromT_CLASSc
wherec.c_idnotin
(
selectdistincts.C_IDfromt_stus
优化:
wherenotexists
wherec.C_ID=s.C_ID
select'
x'
fromt_stus
理解:
查询班级表不存在这种情况:
班级编号与学生表中班级编号相等的情况。
用左连接(效率低),只有对等连接,效率最高。
select*fromT_STUwhereS_AGE>
20
selectc.C_NAME,avg(s.s_age)
havingavg(s.s_age)>
=20
selecte_id,count(*)
fromsalary
whereto_char(e_date,'
yyyy.mm'
)=to_char(sysdate,'
groupbye_id
selecte_id
14.有部门表、人员表、工资表。
bm部门表:
bid,bname
ry人员表:
rid,rname,bid
gz工资表:
rid,money,rq,memo
selectbname,rname,sum(gz.money)
frombm,ry,gz
wherebm.bid=ry.bid
andgz.rid=ry.rid
groupbybid,bname,rid,rname
selectbm.bid,sum(gz.money)
groupbybm.bid
selectbm.bid,bm.bname,sum(gz.money)
groupbybm.bid,bm.bname
andgz.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 笔试 试题 汇总