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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值