数据库笔试面试题汇总.docx
- 文档编号:4056608
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:15
- 大小:22.17KB
数据库笔试面试题汇总.docx
《数据库笔试面试题汇总.docx》由会员分享,可在线阅读,更多相关《数据库笔试面试题汇总.docx(15页珍藏版)》请在冰豆网上搜索。
数据库笔试面试题汇总
数据库笔试面试题汇总
1、什么是第三范式(第一范式,第二范式。
。
。
)
2、请说出delete,truncate,drop的区别
3、怎么样查询特殊字符,如通配符%与_
4、如何插入单引号到数据库表中
5、怎么获得今天是星期几,还关于其它日期函数用法
6、知道出生日期,如何求年龄?
7、求上个月月底的日期
8、数据库类型中Varchar和char的区别是?
9、已知两张表:
人员表(person)和部门表(depart),表结构如下:
10、数据库Teacher属性:
name,tid,desc,表Student属性:
name,sid,related_tid,desc查询所属老师名称为”\like”的全部学生。
11、设有一个关系表Student(学号stu_id,姓名stu_name,系名stu_dept,课程号stu_courseid,成绩grade)
11.1查询至少选修了四门课程的学生的学号、姓名及平均成绩的select语句?
11.2将选修课程数小于5的学生名字后面增加一个#号
12、用一条sql语句实现下面结果:
怎么把这样一个表Testcol:
13、有两个表T_STU表和T_CLASS表和一个序列sequence序列,T_STU表里有如下字段:
13.1查询入学年龄在18-20的女生或者未输入性别的,实际年龄小的要排在后面
13.2查询班级名称、学生姓名、性别、缴费(要求显示单位:
元),相同班级的要放在一起,姓名根据字典顺序排列。
13.3查询各班名称和人数
13.4查询各班名称和人数,但人数必须不少于2,人数多的放在前面
13.5查询1980年出生的有哪些学生。
13.6查询男生和女生人数,没有输入性别的当作男
13.7查询没有人员的班级
13.8查询入学年龄在20以上的同学信息
13.9查询班级平均入学年龄在20及以上的班级
13.10有工资表salary(e_id,e_date,e_money),求本月发了2笔以上工资的员工信息。
14、有部门表、人员表、工资表。
表名和字段名,如下:
14.1查询:
人员名称、部门名称、个人总工资
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:
删除表的定义,整个对象删掉,删除的是对象的本身,全部
truncate:
删除表的内容,只是删除数据,表的结果会保留
3.怎么样查询特殊字符,如通配符%与_
select*fromtablewherenamelike'A_%'escape'_'
4.如何插入单引号到数据库表中
可以用ASCII码处理,其它特殊字符如&也一样,如:
insertintotvalues('i'chr(39)'m');--chr(39)代表字符'
或者用两个单引号表示一个
orinsertintotvalues('I''m');--两个''可以表示一个'
5.怎么获得今天是星期几,还关于其它日期函数用法
(1)可以用to_char来解决,如:
selectto_char(to_date('2002-08-26','yyyy-mm-dd'),'day')fromdual;
(2)在获取之前可以设置日期语言,如:
ALTERSESSIONSETNLS_DATE_LANGUAGE='AMERICAN';
(3)在函数中指定,如:
selectto_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE=American')fromdual;
(4)其它更多用法,可以参考to_char与to_date函数
如获得完整的时间格式
selectto_char(sysdate,'yyyy-mm-ddhh24:
mi:
ss')fromdual;
(5)随便介绍几个其它函数的用法:
本月的天数
SELECTto_char(last_day(SYSDATE),'dd')daysFROMdual
今年的天数
selectadd_months(trunc(sysdate,'year'),12)-trunc(sysdate,'year')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')fromdual;
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)和部门表(depart),表结构如下:
人员表-----person
序号
字段名
中文说明
类型
可空
备注
1
ID
ID号
integer
N
PK
2
DEPT_ID
部门ID号
integer
N
FK与部门表的ID对应
3
NAME
姓名
Varchar2(20)
N
4
SEX
性别
Char
(2)
N
默认为男,只能为男或女
5
BIRTHDAY
出生日期
Date
不能大于当前日期
6
WORK_YEARS
工龄
integer
N
默认0
7
SALARY
工资
Number
N
默认1000.0
部门表---depart
序号
字段名
中文说明
类型
可空
备注
1
ID
ID
Integer
N
PK
2
DEPT_NAME
部门名称
Varchar2(20)
N
3
DPET_TYPE
部门性质
Char
(1)
N
回答问题:
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!
='1');
10.数据库Teacher属性:
name,tid,desc,表Student属性:
name,sid,related_tid,desc查询所属老师名称为”\like”的全部学生。
Select*fromstu2,teacherdwherestu2.related_id=teacherd.tidandteacherd.name='\like';
转义字符
11.设有一个关系表Student(学号stu_id,姓名stu_name,系名stu_dept,课程号stu_courseid,成绩grade)
11.1查询至少选修了四门课程的学生的学号、姓名及平均成绩的select语句?
Select学号,姓名,avg(成绩)fromstudentgroupby学生编号,学生姓名havingcount(课程号)>4;
selectstu_id,stu_name,avg(grade)fromstudenttgroupbystu_id,stu_namehavingcount(stu_courseid)>4
11.2将选修课程数小于5的学生名字后面增加一个#号
第一步:
先求选修课程数小于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)<5);
12.用一条sql语句实现下面结果:
怎么把这样一个表Testcol:
year
month
amount
1991
1
1.1
1991
2
1.2
1991
3
1.3
1991
4
1.4
1992
1
2.1
1992
2
2.2
1992
3
2.3
1992
4
2.4
查成这样一个结果
year
m1
m2
m3
m4
1991
1.1
1.2
1.3
1.4
1992
2.1
2.2
2.3
2.4
以下答案,表名都是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)做法四
selectyear,
sum(casewhenmonth='1'thenamountelse'0'end)asm1,
sum(casewhenmonth='2'thenamountelse'0'end)asm2,
sum(casewhenmonth='3'thenamountelse'0'end)asm3,
sum(casewhenmonth='4'thenamountelse'0'end)asm4
fromtestcol
groupbyyear;
13.有两个表T_STU表和T_CLASS表和一个序列sequence序列,T_STU表里有如下字段:
S_ID
S_NAME
S_SEX
S_BIRTHDAY
S_AGE
S_MOENY
C_ID
1
Dss
女
1980-5-10
30
2000.00
1
T_CLASS表里有如下字段:
C_ID
C_NAME
1
理科重点
还有一个sequence序列:
seq_id
请完成如下的查询:
13.1查询入学年龄在18-20的女生或者未输入性别的,实际年龄小的要排在后面
select*fromT_STU
where(S_AGEbetween18and20andS_SEX='女')or(S_SEXisnull)
orderbyS_BIRTHDAY
或者:
select*fromT_STU
where(S_AGEbetween18and20andS_SEX='女')or(S_SEXisnull)
orderby(sysdate-S_BIRTHDAY)desc
13.2查询班级名称、学生姓名、性别、缴费(要求显示单位:
元),相同班级的要放在一起,姓名根据字典顺序排列。
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
13.3查询各班名称和人数
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
fromT_STUs,T_CLASSC
wheres.C_ID=c.c_id
groupbyc.C_ID,c.C_NAME
13.4查询各班名称和人数,但人数必须不少于2,人数多的放在前面
selectc.C_NAME,count(*)asrs
fromT_STUs,T_CLASSC
wheres.C_ID=c.c_id
groupbyc.C_ID,c.C_NAME
havingcount(*)>=2
orderbycount(*)desc
13.5查询1980年出生的有哪些学生。
select*fromt_stus
whereto_char(s.S_BIRTHDAY,'yyyy')='1980'
13.6查询男生和女生人数,没有输入性别的当作男
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来显示
fromt_stus
groupbys.s_sex
13.7查询没有人员的班级
效率低:
select*fromT_CLASSc
wherec.c_idnotin
(
selectdistincts.C_IDfromt_stus
)
优化:
select*fromT_CLASSc
wherenotexists
(
select*fromt_stus
wherec.C_ID=s.C_ID
)
或者:
select*fromT_CLASSc
wherenotexists
(
select'x'fromt_stus
wherec.C_ID=s.C_ID
)
理解:
查询班级表不存在这种情况:
班级编号与学生表中班级编号相等的情况。
或者:
用左连接(效率低),只有对等连接,效率最高。
13.8查询入学年龄在20以上的同学信息
select*fromT_STUwhereS_AGE>20
13.9查询班级平均入学年龄在20及以上的班级
selectc.C_NAME,avg(s.s_age)
fromT_STUs,T_CLASSC
wheres.C_ID=c.c_id
groupbyc.C_ID,c.C_NAME
havingavg(s.s_age)>=20
13.10有工资表salary(e_id,e_date,e_money),求本月发了2笔以上工资的员工信息。
selecte_id,count(*)
fromsalary
whereto_char(e_date,'yyyy.mm')=to_char(sysdate,'yyyy.mm')
groupbye_id
havingcount(*)>=2
或者:
selecte_id
fromsalary
whereto_char(e_date,'yyyy.mm')=to_char(sysdate,'yyyy.mm')
groupbye_id
havingcount(*)>=2
14.有部门表、人员表、工资表。
表名和字段名,如下:
bm部门表:
bid,bname
ry人员表:
rid,rname,bid
gz工资表:
rid,money,rq,memo
14.1查询:
人员名称、部门名称、个人总工资
selectbname,rname,sum(gz.money)
frombm,ry,gz
wherebm.bid=ry.bid
andgz.rid=ry.rid
groupbybid,bname,rid,rname
14.2查询所有部门的总工资
selectbm.bid,sum(gz.money)
frombm,ry,gz
wherebm.bid=ry.bid
andgz.rid=ry.rid
groupbybm.bid
或者:
selectbm.bid,bm.bname,sum(gz.money)
frombm,ry,gz
wherebm.bid=ry.bid
andgz.rid=ry.rid
groupbybm.bid,bm.bname
或者:
selectbm.bid,sum(gz.money)
frombm,ry,gz
wherebm.bid=ry.bid
andgz.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 笔试 试题 汇总