SQL 面试题

 

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 2
2005-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 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 #tmp

group by rq
2) select N.rq,N.勝,M.負
from (
select rq,勝=count(*) from #tmp where shengfu='胜
'group by rq)N inner join
(select rq,負=count(*) from #tmp where shengfu='负
'group by rq)M on N.rq=M.rq
3)select a.rq,a.a1 胜,b.b1 负 from (select rq,count(rq) a1 from #tmp where shengfu='胜
' group by rq) a,
(select rq,count(rq) b1 from #tmp where shengfu='负' group by rq) b  where a.rq=b.rq

select name,sum(case Score when '' then 1 else 0 end) as ,

              sum(case score when '' then 1 else 0 end) as

              from score group by name

运行结果:

 

 

 

2.请教一个面试中遇到的SQL语句的查询问题
表中有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 #tmp values('40','10','20')
select * from #tmp
select (case when a>b then a else b end),(case when b>c then b else c end ) from #tmp


3.面试题:一个日期判断的sql语句?
请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)
------------------------------------------
select * from #tmp where datediff(dd,rq,getdate())=0
select * from #tmp where rq=rtrim(convert(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 #tmp

select (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 #tmp

5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别?
------------------------------------------
用户临时表
:create table #xx(ID int, IDValues int)
系统临时表:create table ##xx(ID int, IDValues int)

区别:
用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的
.
当创建它的进程消失时这个临时表就自动删除.

全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.

6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
------------------------------------------
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL    Server的存储容量是可以扩大的.

SQL Server 2000 数据库有三种类型的文件:

主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文

件的推荐文件扩展名是 .ndf。

日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。

7.请用一个sql语句得出结果
从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。
如使用存储过程也可以。

table1

月份mon 部门dep 业绩yj
-------------------------------
一月份
      01      10
一月份
      02      10
一月份
      03      5
二月份
      02      8
二月份
      04      9
三月份      03      8

table2

部门dep      部门名称dname
--------------------------------
      01      国内业务一部

      02      国内业务二部
      03      国内业务三部
      04      国际业务部

table3 (result)

部门dep 一月份      二月份      三月份
--------------------------------------
      01      10        null      null
      02      10         8        null
      03      null       5        8
      04      null      null      9

------------------------------------------

create table #A(mon varchar(10),dep varchar(10) ,yj int)
insert into #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 #A

create table #B(dep varchar(10),dname varchar(20))
insert into #B values('01','国内业务一部
')
insert into #B values('02','国内业务二部
')
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 #B

2)select b.dep,dname,
       sum(case when a.mon='一月份' then a.yj else 0 end ) as '一月份
',
       sum(case when a.mon='二月份' then a.yj else 0 end ) as '一月份
',
       sum(case when a.mon='三月份' then a.yj else 0 end ) as '一月份
'
from  #B b left join  #A a on a.dep=b.dep group by b.dep ,dname --order by b.dep

 

??)
select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份
'
from table1 a,table2 b,table2 c,table2 d
where a.部门dep = b.部门dep and b.月份mon = '一月份
' and
a.部门dep = c.部门dep and c.月份mon = '二月份
' and
a.部门dep = d.部门dep and d.月份mon = '三月份' and


8.华为一道面试题
一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
------------------------------------------
create table #B(dep varchar(10),dname varchar(20))
insert into #B values('01','
国内业务一部')
insert into #B values('02','国内业务二部
')
insert into #B values('03','国内业务三部
')
insert into #B values('04','国际业务部
')
insert into #B values('01','国内业务一部
')
insert into #B values('02','国内业务二部
')
insert into #B values('01','国内业务三部
')
insert into #B values('03','国际业务部
')
select * from #b

select dep,count(dep) from #B  group by dep having count(*)>1
select count(*) from #B  group by dep having count(*)>1
select * from(select count(dep) as count from #B group by dep)T where T.count>1

求其中同一个号码的两次通话之间间隔大于10秒的通话记录ID

例如:678910条记录均符合

ID 主叫号码 被叫号码    通话起始时间         通话结束时间     通话时长

1  98290000 0215466546656 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 0755133329866 2007-02-01 10:04:31.000 2007-02-01 10:07:13.000 162

5  78290000 0755255708638 2007-02-01 10:48:26.000 2007-02-01 10:49:23.000 57

6  78290000 0755821119109 2007-02-01 10:49:39.000 2007-02-01 10:52:55.000 196

7  78290000 035730928370  2007-02-01 11:30:45.000 2007-02-01 11:31:58.000 73

8  78290000 0871138889904 2007-02-01 11:33:47.000 2007-02-01 11:35:00.000 73

9  68290000 035730928379  2007-02-01 11:52:20.000 2007-02-01 11:54:56.000 156

10  68290000 0298521811199 2007-02-01 12:44:45.000 2007-02-01 12:45:04.000 19

答案:

SELECT DISTINCT a.* FROM dbo.hc a left join dbo.hc b

ON a.主叫号码=b.主叫号码

WHERE a.id<>b.id AND (DATEDIFF(second,a.通话起始时间,b.通话结束时间)>10 AND

DATEDIFF(second,b.通话起始时间,a.通话结束时间)>10)

用户信息提前1分钟提示

select * from T_user where DATEDIFF(SECOND,T_user.ErrorTime,GETDATE())>=60

分页语句(分页语句)

select * from (select ROW_NUMBER() over(order by userid) as rownum, * from T_UserInfo) t where t.rownum>3 and t.rownum<=6

 

 

 

题目1:

问题描述:

  为管理岗位业务培训信息,建立3个表:

 S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄

 C (C#,CN ) C#,CN 分别代表课程编号、课程名称

 SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩

 1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名

 --实现代码:

 Select SN,SD FROM S Where [S#] IN( Select [S#] FROM C,SC Where C.[C#]=SC.[C#] AND CN=N'税收基础')

 2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位

 --实现代码:

 Select S.SN,S.SD FROM S,SC Where S.[S#]=SC.[S#] AND SC.[C#]='C2'

 3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位

 --实现代码:

 Select SN,SD FROM S Where [S#] NOT IN( Select [S#] FROM SC Where [C#]='C5')

 4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位

 --实现代码:

 Select SN,SD FROM S Where [S#] IN( Select [S#] FROM SC RIGHT JOIN C ON SC.[C#]=C.[C#] GROUP BY [S#] HAVING COUNT(*)=COUNT([S#]))

 5. 查询选修了课程的学员人数

 --实现代码:

 Select 学员人数=COUNT(DISTINCT [S#]) FROM SC

 6. 查询选修课程超过5门的学员学号和所属单位

 --实现代码:

 Select SN,SD FROM S Where [S#] IN( Select [S#] FROM SC GROUP BY [S#] HAVING COUNT(DISTINCT [C#])>5)

题目2:

问题描述:

 

 S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名

 C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师

 SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩

 1. 找出没有选修过“李明”老师讲授课程的所有学生姓名

 --实现代码:

 Select SNAME FROM S Where NOT EXISTS( Select * FROM SC,C Where SC.CNO=C.CNO AND CNAME='李明' AND SC.SNO=S.SNO)

 

 2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

 --实现代码:

 Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE) FROM S,SC,( Select SNO FROM SC Where SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2 )A Where S.SNO=A.SNO AND SC.SNO=A.SNO GROUP BY S.SNO,S.SNAME

 

 3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名

 --实现代码:

 Select S.SNO,S.SNAME FROM S,( Select SC.SNO FROM SC,C Where SC.CNO=C.CNO AND C.CNAME IN('1','2') GROUP BY SNO HAVING COUNT(DISTINCT CNO)=2 )SC Where S.SNO=SC.SNO

 

 4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号

 --实现代码:

 Select S.SNO,S.SNAME FROM S,( Select SC1.SNO FROM SC SC1,C C1,SC SC2,C C2 Where SC1.CNO=C1.CNO AND C1.NAME='1' AND SC2.CNO=C2.CNO AND C2.NAME='2' AND SC1.SCGRADE>SC2.SCGRADE )SC Where S.SNO=SC.SNO

 

 5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩

 --实现代码:

 

 Select S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩] FROM S,( Select SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE FROM SC SC1,C C1,SC SC2,C C2 Where SC1.CNO=C1.CNO AND C1.NAME='1' AND SC2.CNO=C2.CNO AND C2.NAME='2' AND SC1.SCGRADE>SC2.SCGRADE )SC Where S.SNO=SC.SNO

 

阅读更多
个人分类: SQL
想对作者说点什么? 我来说一句

SQL全部分析面试题

2008年10月10日 1KB 下载

SQL面试题

2011年06月07日 23KB 下载

SQL面试题2

2018年05月02日 263KB 下载

SQL面试题SQL面试题SQL面试题

2010年07月21日 169KB 下载

sqlsqlSQL面试题

2011年05月26日 4KB 下载

sql面试题以及答案

2010年10月25日 229KB 下载

sql面试题,java面试题

2008年11月19日 42KB 下载

SQL经典面试题-很有用

2009年03月16日 39KB 下载

SQL面试题(很全,带答案)

2010年01月29日 46KB 下载

没有更多推荐了,返回首页

不良信息举报

SQL 面试题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭