《SQL语句简单面试题.docx》由会员分享,可在线阅读,更多相关《SQL语句简单面试题.docx(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1. 一道sql语句面试题,关于group by表内容:2005-05-09 胜2005-05-09 胜2005-05-09 负2005-05-09 负2005-05-10 胜2005-05-10 负2005-05-10 负如果要生成以下结果, 该如何写sql语句?胜 负2005-05-09 2 22005-05-10 1 2-create table #tmp(rq varchar(10),shengfu nchar(1)insert into #tmp values(2005-05-09,胜)insert into #tmp values(2005-05-09,胜)insert into
2、#tmp values(2005-05-09,负)insert into #tmp values(2005-05-09,负)insert into #tmp values(2005-05-10,胜)insert into #tmp values(2005-05-10,负)insert into #tmp values(2005-05-10,负)1) select rq, sum(case when shengfu=胜 then 1 else 0 end)胜,sum(case when shengfu=负 then 1 else 0 end)负 from #tmpgroup by rq2) se
3、lect n.rq,n.勝,m.負 from (3) select a.rq,a.a1 胜,b.b1 负 from (select rq,count(rq) a1 from #tmp whereshengfu=胜 group by rq) a,表中有a b c三列,用sql语句实现:当a列大于b列时选择a列否那么选择b列,当b列大于c列时选择b列否那么选择c列。-create table #tmp(a int,b int,c int)insert into #tmp values(10,20,30)-insert into #tmp values(10,30,20)-insert into #
4、tmp values(40,10,20)select * from #tmpselect (case when a>b then a else b end),(case when b>c then b else c end ) from #tmp3.面试题:一个日期判断的sql语句?请取出tb_send表中日期(sendtime字段)为当天的所有记录?(sendtime字段为datetime型,包含日期及时间)-select * from #tmp where datediff(dd,rq,getdate()=0select * from #tmp where rq=rtrim(c
5、onvert(varchar,getdate(),23)4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来并写出您的思路:大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。 显示格式:语文 数学 英语及格 优秀 不及格-create table #tmp(语文 int,数学 int ,英语 int)insert into #tmp values(70,80,58)-insert into #tmp values(100,50,60)select * from #tm
6、pselect (case when 语文 >=80 then 优秀when 语文 >=60 then 及格else 不及格 end ) 语文,(case when 数学 >=80 then 优秀when 数学 >=60 then 及格else 不及格 end ) 数学,(case when 英语 >=80 then 优秀when 英语 >=60 then 及格else 不及格 end ) 英语from #tmp5.在sqlserver2000中请用sql创立一张用户临时表和系统临时表,里面包含两个字段id和idvalues,类型都是int型,并解释下两者的
7、区别?-用户临时表:create table #xx(id int, idvalues int)系统临时表:create table #xx(id int, idvalues int)区别:用户临时表只对创立这个表的用户的session可见,对其他进程是不可见的.当创立它的进程消失时这个临时表就自动删除.全局临时表对整个sql server实例都可见,但是所有访问它的session都消失的时候,它也自动删除.6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。-它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大
8、,sql server的存储容量是可以扩大的.sql server 2000 数据库有三种类型的文件:主要数据文件主要数据文件是数据库的起点,指向数据库中文件的其它局部。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。次要数据文件次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库那么有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。日志文件日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。从table1,table2中取出如table3
9、所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。如使用存储过程也可以。table1月份mon 部门dep 业绩yj-一月份0110一月份0210一月份035二月份028二月份049三月份038table2部门dep部门名称dname-01国内业务一部02国内业务二部03国内业务三部04国际业务部table3 result部门dep 一月份二月份三月份-0110 nullnull02108 null03null 5 804nullnull9-create table #a(mon varchar(10),dep varchar(10) ,yj int)insert into
10、 #a values(一月份,01,10)insert into #a values(一月份,02,10)insert into #a values(一月份,03,5)insert into #a values(二月份,02,8)insert into #a values(二月份,04,9)insert into #a values(三月份,03,8)select * from #acreate table #b(dep varchar(10),dname varchar(20)insert into #b values(01,国内业务一部)insert into #b values(02,国
11、内业务二部)insert into #b values(03,国内业务三部)insert into #b values(04,国际业务部)select * from #b-1) select dep,(select sum(yj) from #a where mon=一月份 and #a.dep=#b.dep) 一月份,(select sum(yj) from #a where mon=二月份 and #a.dep=#b.dep) 二月份,(select sum(yj) from #a where mon=三月份 and #a.dep=#b.dep) 三月份 from #b2) select
12、b.dep,dname,sum(case when a.mon=一月份 then a.yj else 0 end ) as 一月份,篇二:十几道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 (select s#,score from sc where c#=001) a,(select s#,score fr
13、om sc where c#=002) bwherea.score>b.score and a.s#=b.s#;2、查询平均成绩大于60分的同学的学号和平均成绩;select s#,avg(score)fromscgroup by s# having avg(score) >60;3、查询所有同学的学号、姓名、选课数、总成绩;select student.s#,student.sname,count(sc.c#),sum(score)from student left outer join sc on student.s#=sc.s#group by student.s#,snam
14、e4、查询姓“李的教师的个数;select count(distinct(tname)from teacherwhere tname like 李%;5、查询没学过“叶平教师课的同学的学号、姓名;from studentwhere s# not in (select distinct( sc.s#) from sc,course,teacher where sc.c#=course.c# and teacher.t#=course.t# and teacher.tname=叶平);6、查询学过“001并且也学过编号“002课程的同学的学号、姓名;fromstudent,scwhere stud
15、ent.s#=sc.s# and sc.c#=001and exists( select * from sc as sc_2 where sc_2.s#=sc.s# and sc_2.c#=002);7、查询学过“叶平教师所教的所有课的同学的学号、姓名;select s#,snamefrom studentwhere s# in(select s#from sc ,course ,teacherwhere sc.c#=course.c# and teacher.t#=course.t# and teacher.tname=叶平 group by s# having count(sc.c#)=(
16、select count(c#) from course,teacher where teacher.t#=course.t# and tname=叶平);8、查询所有课程成绩小于60分的同学的学号、姓名;select s#,snamefrom studentwhere s# not in (select student.s# from student,sc where s.s#=sc.s# and score>60);9、查询没有学全所有课的同学的学号、姓名;fromstudent,scwherestudent.s#=sc.s#group by student.s#,student.s
17、name having count(c#) <(select count(c#) from course);10、查询至少有一门课及学号为“1001的同学所学一样的同学的学号和姓名; select s#,snamefromstudent,scwhere student.s#=sc.s# and c# in select c# from sc where s#=1001;11、删除学习“叶平教师课的sc表记录;delect scfrom course ,teacherwhere course.c#=sc.c# and course.t#= teacher.t# and tname=叶平;f
18、rom sc l ,sc rwhere l.c# = r.c#andl.score = (select max(il.score)from sc il,student imwhere il.c# = l.c# and im.s#=il.s#group by il.c#)andr.score = (select min(ir.score)from sc irwhere ir.c# = r.c#group by ir.c# );13、查询学生平均成绩及其名次select 1+(select count( distinct 平均成绩)from (select s#,avg(score) 平均成绩fr
19、om scgroup by s# ) t1where 平均成绩> t2.平均成绩) 名次, s# 学生学号,平均成绩from (select s#,avg(score) 平均成绩 from sc group by s# ) t2order by 平均成绩desc;14、查询各科成绩前三名的记录:(不考虑成绩并列情况)select t1.s# as 学生id,t1.c# as 课程id,score as 分数from sc t1where score in (select top 3 scorefrom scwhere t1.c#= c#order by score desc)order
20、by t1.c#;15、查询每门功成绩最好的前两名select t1.s# as 学生id,t1.c# as 课程id,score as 分数from sc t1where score in (select top 2 scorefrom scwhere t1.c#= c#order by score desc )order by t1.c#;补充:已经知道原表year salary2000 10002001 20002002 30002003 4000解:selectb.year,sum(a.salary)from salary a,salary border by b.year;在面试过程
21、中屡次碰到一道sql查询的题目,查询a(id,name)表中第31至40条记录,id作为主键可能是不是连续增长的列,完整的查询语句如下:方法一:select top 10 *from awhere id >(select max(id) from (select top 30 id from a order by id ) t) order by id方法二:select top 10 *from awhere id not in (select top 30 id from a order by id)order by id第2局部:数据库及sql局部:共4题:根底3道,中等难度1道1
22、06、有3个表15分钟:【根底】student 学生表 (学号,姓名,性别,年龄,组织部门)course 课程表 (编号,课程名称)sc选课表 (学号,课程编号,成绩)表构造如下:1写一个sql语句,查询选修了计算机原理的学生学号和姓名3分钟2写一个sql语句,查询周星驰同学选修了的课程名字3分钟3写一个sql语句,查询选修了5门课程的学生学号和姓名9分钟答:1sql语句如下:selectstu.sno, stu.sname from student stuwhere (select count(*) from sc where sno=stu.sno and cno =(select cno
23、 from course where cname=计算机原理) != 0;2sql语句如下:selectcname from coursewherecno in ( select cno from sc where sno =(select sno from student where sname=周星驰);3sql语句如下:selectstu.sno, stu.sname from student stuwhere (select count(*) from sc where sno=stu.sno) = 5;107、有三张表,学生表s,课程c,学生课程表sc,学生可以选修多门课程,一门课程
24、可以被多个学生选修,通过sc表关联。【根底】1写出建表语句;2写出sql语句,查询选修了所有选修课程的学生;3写出sql语句,查询选修了至少5门以上的课程的学生。答:1建表语句如下mysql数据库:create table s(id integer primary key, name varchar(20);create table c(id integer primary key, name varchar(20);create table sc(sid integer references s(id),cid integer references c(id),primary key(sid
25、,cid);2sql语句如下:select stu.id, stu.name from s stuwhere (select count(*) from sc where sid=stu.id) = (select count(*) from c);3sql语句如下:select stu.id, stu.name from s stuwhere (select count(*) from sc where sid=stu.id)>=5; 108、数据库表(test)构造如下:【根底】id name age manager(所属主管人id)106 a 30 104109 b 19 1041
26、04 c 20 111107 d 35 109112 e 25 120119 f 45 null要求:列出所有年龄比所属主管年龄大的人的id和名字? 答:sql语句如下:select employee.name from test employeewhereemployee.age> (select manager.age from test manager where manager.id=employee.manager);109、有如下两张表:【中等难度】表city:表state:cityno cityname statenobj 北京 nullsh 上海 nullgz gd 广州
27、dl ln 大连state no state namegd 广东ln 辽宁sd 山东nmg 内蒙古欲得到如下结果:city no city name state no state namebj 北京nullnulldl 大连 ln 辽宁gz 广州 gd 广东sh 上海nullnull写相应的sql语句。答:sql语句为:select c.cityno, c.cityname, c.stateno, s.statename from city c, state swhere c.stateno=s.stateno(+)order by(c.cityno);篇三:sql语句面试题1. 一道sql语
28、句面试题,关于group by表内容:2005-05-09 胜2005-05-09 胜2005-05-09 负2005-05-09 负2005-05-10 胜2005-05-10 负2005-05-10 负如果要生成以下结果, 该如何写sql语句? 胜 负2005-05-09 2 22005-05-10 1 2-create table #tmp(rq varchar(10),shengfu nchar(1)insert into #tmp values(2005-05-09,胜)insert into #tmp values(2005-05-09,胜) insert into #tmp va
29、lues(2005-05-09,负) insert into #tmp values(2005-05-09,负) insert into #tmp values(2005-05-10,胜) insert into #tmp values(2005-05-10,负) insert into #tmp values(2005-05-10,负)1) select rq, sum(case when shengfu=胜 then 1 else 0 end)胜,sum(case when shengfu=负 then 1 else 0 end)负 from #tmpgroup by rq2) selec
30、t n.rq,n.勝,m.負 from (真的不掉线吗?、?select rq,勝=count(*) from #tmp where shengfu=胜group by rq)n inner join (select rq,負=count(*) from #tmp where3) select a.rq,a.a1 胜,b.b1 负 from (select rq,count(rq) a1 from #tmp where shengfu=胜 group by rq) a,表中有a b c三列,用sql语句实现:当a列大于b列时选择a列否那么选择b列,当b列大于c列时选择b列否那么选择c列。-cr
31、eate table #tmp(a int,b int,c int)insert into #tmp values(10,20,30) -insert into #tmp values(10,30,20) -insert into #tmp values(40,10,20) select * from #tmpselect (case when a>b then a else bend),(case when b>c then b else c end ) from #tmp3.面试题:一个日期判断的sql语句?请取出tb_send表中日期(sendtime字段)为当天的所有记录?(sendtime字段为datetime型,包含日期及时间)-select * from #tmp wheredatediff(dd,rq,getdate()=0select * from #tmp whererq=rtrim(convert(varchar,getdate(),23)4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来并写出您的思路:大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。99
限制150内