十几道sql语句面试题.docx
- 文档编号:7241991
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:13
- 大小:22.35KB
十几道sql语句面试题.docx
《十几道sql语句面试题.docx》由会员分享,可在线阅读,更多相关《十几道sql语句面试题.docx(13页珍藏版)》请在冰豆网上搜索。
十几道sql语句面试题
十几道sql语句面试题
第1部分:
题目:
Student(S#,Sname,Sage,Ssex)学生表
Course(C#,Cname,T#)课程表
SC(S#,C#,score)成绩表
Teacher(T#,Tname)教师表
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
selecta.S#
from(selects#,scorefromSCwhereC#=’001′)a,
(selects#,scorefromSCwhereC#=’002′)b
wherea.score>b.scoreanda.s#=b.s#;
2、查询平均成绩大于60分的同学的学号和平均成绩;
selectS#,avg(score)
fromsc
groupbyS#havingavg(score)>60;
3、查询所有同学的学号、姓名、选课数、总成绩;
selectStudent.S#,Student.Sname,count(SC.C#),sum(score)
fromStudentleftOuterjoinSConStudent.S#=SC.S#
groupbyStudent.S#,Sname
4、查询姓“李”的老师的个数;
selectcount(distinct(Tname))
fromTeacher
whereTnamelike‘李%’;
5、查询没学过“叶平”老师课的同学的学号、姓名;
selectStudent.S#,Student.Sname
fromStudent
whereS#notin(selectdistinct(SC.S#)fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname=’叶平’);
6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
selectStudent.S#,Student.Sname
fromStudent,SC
whereStudent.S#=SC.S#andSC.C#=’001′andexists(Select*fromSCasSC_2whereSC_2.S#=SC.S#andSC_2.C#=’002′);
7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
selectS#,Sname
fromStudent
whereS#in
(selectS#
fromSC,Course,Teacher
whereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname=’叶平’groupbyS#havingcount(SC.C#)=(selectcount(C#)fromCourse,TeacherwhereTeacher.T#=Course.T#andTname=’叶平’));
8、查询所有课程成绩小于60分的同学的学号、姓名;
selectS#,Sname
fromStudent
whereS#notin(selectStudent.S#fromStudent,SCwhereS.S#=SC.S#andscore>60);
9、查询没有学全所有课的同学的学号、姓名;
selectStudent.S#,Student.Sname
fromStudent,SC
whereStudent.S#=SC.S#
groupbyStudent.S#,Student.Snamehavingcount(C#)<(selectcount(C#)fromCourse);
10、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
selectS#,Sname
fromStudent,SC
whereStudent.S#=SC.S#andC#in(selectC#fromSCwhereS#='1001');
11、删除学习“叶平”老师课的SC表记录;
DelectSC
fromcourse,Teacher
whereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTname='叶平';
12、查询各科成绩最高和最低的分:
以如下形式显示:
课程ID,最高分,最低分
SELECTL.C#课程ID,L.score最高分,R.score最低分
FROMSCL,SCR
WHEREL.C#=R.C#
and
L.score=(SELECTMAX(IL.score)
FROMSCIL,StudentIM
WHEREIL.C#=L.C#andIM.S#=IL.S#
GROUPBYIL.C#)
and
R.Score=(SELECTMIN(IR.score)
FROMSCIR
WHEREIR.C#=R.C#
GROUPBYIR.C#);
13、查询学生平均成绩及其名次
SELECT1+(SELECTCOUNT(distinct平均成绩)
FROM(SELECTS#,AVG(score)平均成绩
FROMSC
GROUPBYS#)T1
WHERE平均成绩>T2.平均成绩)名次,S#学生学号,平均成绩
FROM(SELECTS#,AVG(score)平均成绩FROMSCGROUPBYS#)T2
ORDERBY平均成绩desc;
14、查询各科成绩前三名的记录:
(不考虑成绩并列情况)
SELECTt1.S#as学生ID,t1.C#as课程ID,Scoreas分数
FROMSCt1
WHEREscoreIN(SELECTTOP3score
FROMSC
WHEREt1.C#=C#
ORDERBYscoreDESC)
ORDERBYt1.C#;
15、查询每门功成绩最好的前两名
SELECTt1.S#as学生ID,t1.C#as课程ID,Scoreas分数
FROMSCt1
WHEREscoreIN(SELECTTOP2score
FROMSC
WHEREt1.C#=C#
ORDERBYscoreDESC)
ORDERBYt1.C#;
补充:
已经知道原表
yearsalary
——————
20001000
20012000
20023000
20034000
解:
selectb.year,sum(a.salary)
fromsalarya,salaryb
wherea.year<=b.year
groupbyb.year
orderbyb.year;
在面试过程中多次碰到一道SQL查询的题目,查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,完整的查询语句如下:
方法一:
selecttop10*
fromA
whereID>(selectmax(ID)from(selecttop30IDfromAorderbyID)T)orderbyID
方法二:
selecttop10*
fromA
whereIDnotIn(selecttop30IDfromAorderbyID)
orderbyID
第2部分:
数据库及SQL部分:
(共4题:
基础3道,中等难度1道)
106、有3个表(15分钟):
【基础】
Student学生表(学号,姓名,性别,年龄,组织部门)
Course课程表(编号,课程名称)
Sc选课表(学号,课程编号,成绩)
表结构如下:
1)写一个SQL语句,查询选修了’计算机原理’的学生学号和姓名(3分钟)
2)写一个SQL语句,查询’周星驰’同学选修了的课程名字(3分钟)
3)写一个SQL语句,查询选修了5门课程的学生学号和姓名(9分钟)
答:
1)SQL语句如下:
selectstu.sno,stu.snamefromStudentstu
where(selectcount(*)fromscwheresno=stu.snoandcno=
(selectcnofromCoursewherecname='计算机原理'))!
=0;
2)SQL语句如下:
selectcnamefromCourse
wherecnoin(selectcnofromscwheresno=
(selectsnofromStudentwheresname='周星驰'));
3)SQL语句如下:
selectstu.sno,stu.snamefromstudentstu
where(selectcount(*)fromscwheresno=stu.sno)=5;
107、有三张表,学生表S,课程C,学生课程表SC,学生可以选修多门课程,一门课程可以被多个学生选修,通过SC表关联。
【基础】
1)写出建表语句;
2)写出SQL语句,查询选修了所有选修课程的学生;
3)写出SQL语句,查询选修了至少5门以上的课程的学生。
答:
1)建表语句如下(mysql数据库):
createtables(idintegerprimarykey,namevarchar(20));
createtablec(idintegerprimarykey,namevarchar(20));
createtablesc(
sidintegerreferencess(id),
cidintegerreferencesc(id),
primarykey(sid,cid)
);
2)SQL语句如下:
selectstu.id,stu.namefromsstu
where(selectcount(*)fromscwheresid=stu.id)
=(selectcount(*)fromc);
3)SQL语句如下:
selectstu.id,stu.namefromsstu
where(selectcount(*)fromscwheresid=stu.id)>=5;
108、数据库表(Test)结构如下:
【基础】
IDNAMEAGEMANAGER(所属主管人ID)
106A30104
109B19104
104C20111
107D35109
112E25120
119F45NULL
要求:
列出所有年龄比所属主管年龄大的人的ID和名字?
答:
SQL语句如下:
selectemployee.namefromtestemployee
whereemployee.age>(selectmanager.agefromtestmanager
wheremanager.id=employee.manager);
109、有如下两张表:
【中等难度】
表city:
表state:
CityNo
CityName
StateNo
BJ
北京
(Null)
SH
上海
(Null)
GZ
广州
GD
DL
大连
LN
StateNo
StateName
GD
广东
LN
辽宁
SD
山东
NMG
内蒙古
欲得到如下结果:
CityNoCityNameStateNoStateName
BJ北京(Null)(Null)
DL大连LN辽宁
GZ广州GD广东
SH上海(Null)(Null)
写相应的SQL语句。
答:
SQL语句为:
SELECTC.CITYNO,C.CITYNAME,C.STATENO,S.STATENAME
FROMCITYC,STATES
WHEREC.STATENO=S.STATENO(+)
ORDERBY(C.CITYNO);
第3部分:
1.一道SQL语句面试题,关于groupby
表内容:
2005-05-09胜
2005-05-09胜
2005-05-09负
2005-05-09负
2005-05-10胜
2005-05-10负
2005-05-10负
如果要生成下列结果,该如何写sql语句?
胜负
2005-05-0922
2005-05-1012
------------------------------------------
createtable#tmp(rqvarchar(10),shengfunchar
(1))
insertinto#tmpvalues('2005-05-09','胜')
insertinto#tmpvalues('2005-05-09','胜')
insertinto#tmpvalues('2005-05-09','负')
insertinto#tmpvalues('2005-05-09','负')
insertinto#tmpvalues('2005-05-10','胜')
insertinto#tmpvalues('2005-05-10','负')
insertinto#tmpvalues('2005-05-10','负')
1)selectrq,sum(casewhenshengfu='胜'then1else0end)'胜',sum(casewhenshengfu='负'then1else0end)'负'from#tmpgroupbyrq
2)selectN.rq,N.勝,M.負from(
selectrq,勝=count(*)from#tmpwhereshengfu='胜'groupbyrq)Ninnerjoin
(selectrq,負=count(*)from#tmpwhereshengfu='负'groupbyrq)MonN.rq=M.rq
3)selecta.col001,a.a1胜,b.b1负from
(selectcol001,count(col001)a1fromtemp1wherecol002='胜'groupbycol001)a,
(selectcol001,count(col001)b1fromtemp1wherecol002='负'groupbycol001)b
wherea.col001=b.col001
2.请教一个面试中遇到的SQL语句的查询问题
表中有ABC三列,用SQL语句实现:
当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
------------------------------------------
select(casewhena>bthenaelsebend),
(casewhenb>cthenbeslecend)
fromtable_name
3.面试题:
一个日期判断的sql语句?
请取出tb_send表中日期(SendTime字段)为当天的所有记录?
(SendTime字段为datetime型,包含日期与时间)
------------------------------------------
select*fromtbwheredatediff(dd,SendTime,getdate())=0
4.有一张表,里面有3个字段:
语文,数学,英语。
其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
显示格式:
语文数学英语
及格优秀不及格
------------------------------------------
select
(casewhen语文>=80then'优秀'
when语文>=60then'及格'
else'不及格')as语文,
(casewhen数学>=80then'优秀'
when数学>=60then'及格'
else'不及格')as数学,
(casewhen英语>=80then'优秀'
when英语>=60then'及格'
else'不及格')as英语,
fromtable
5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别?
------------------------------------------
用户临时表:
createtable#xx(IDint,IDValuesint)
系统临时表:
createtable##xx(IDint,IDValuesint)
区别:
用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.
当创建它的进程消失时这个临时表就自动删除.
全局临时表对整个SQLServer实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.
6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
------------------------------------------
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQLServer的存储容量是可以扩大的.
SQLServer2000数据库有三种类型的文件:
主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。
每个数据库都有一个主要数据文件。
主要数据文件的推荐文件扩展名是.mdf。
次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。
有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。
次要数据文件的推荐文件扩展名是.ndf。
日志文件
日志文件包含恢复数据库所需的所有日志信息。
每个数据库必须至少有一个日志文件,但可以不止一个。
日志文件的推荐文件扩展名是.ldf。
7.请用一个sql语句得出结果
从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。
如使用存储过程也可以。
table1
月份mon部门dep业绩yj
-------------------------------
一月份0110
一月份0210
一月份035
二月份028
二月份049
三月份038
table2
部门dep部门名称dname
--------------------------------
01国内业务一部
02国内业务二部
03国内业务三部
04国际业务部
table3(result)
部门dep一月份二月份三月份
--------------------------------------
0110nullnull
02108null
03null58
04nullnull9
------------------------------------------
1)
selecta.部门名称dname,b.业绩yjas'一月份',c.业绩yjas'二月份',d.业绩yjas'三月份'
fromtable1a,table2b,table2c,table2d
wherea.部门dep=b.部门depandb.月份mon='一月份'and
a.部门dep=c.部门depandc.月份mon='二月份'and
a.部门dep=d.部门depandd.月份mon='三月份'and
2)
selecta.dep,
sum(casewhenb.mon=1thenb.yjelse0end)as'一月份',
sum(casewhenb.mon=2thenb.yjelse0end)as'二月份',
sum(casewhenb.mon=3thenb.yjelse0end)as'三月份',
sum(casewhenb.mon=4thenb.yjelse0end)as'四月份',
sum(casewhenb.mon=5thenb.yjelse0end)as'五月份',
sum(casewhenb.mon=6thenb.yjelse0end)as'六月份',
sum(casewhenb.mon=7thenb.yjelse0end)as'七月份',
sum(casewhenb.mon=8thenb.yjelse0end)as'八月份',
sum(casewhenb.mon=9thenb.yjelse0end)as'九月份',
sum(casewhenb.mon=10thenb.yjelse0end)as'十月份',
sum(casewhenb.mon=11thenb.yjelse0end)as'十一月份',
sum(casewhenb.mon=12thenb.yjelse0end)as'十二月份',
fromtable2aleftjointable1bona.dep=b.dep
8.华为一道面试题
一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
------------------------------------------
selectid,Count(*)fromtbgroupbyidhavingcount(*)>1
select*from(selectcount(ID)as
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 十几道 sql 语句 试题