你的位置:首页 > 数据库

[数据库]Sql面试常考题(持续添加)


  最近萌生换工作的念头,于是上网下载了一些公司的面试题,重新看了面试题中的Sql部分,这些查询题有时候只是兜一个弯角来考,对于给EF惯坏的孩子来说还是有点难度的(给面试官鄙视了几下的结果),所以列出最近感觉比较有意思的Sql查询题。

 

1.查询出子节点最多的NodeName,如下图的table, 

NodeName子节点
节点11
节点22
节点31
节点31
节点31
节点42
节点43

 

 

 

 

 

 

 

 

 1 declare @t table( id int ,NodeName varchar(50 ),parentId int) 2  3 insert into @t 4 select 4, '节点1' ,1 5 union all 6 select 5, '节点2' ,2 7 union all 8 select 6, '节点3' ,1 9 union all10 select 7, '节点3' ,111 union all12 select 1, '节点3' ,113 union all14 select 2, '节点4' ,215 union all16 select 3, '节点4' ,317 18 select * from @t19 20 select top 1 nodename, COUNT(*) from @t group by NodeName order by COUNT(*) desc

View Code

 

 

 

2.有表A如下图,需要转换成表B格式

单号   金额                              

Rk1     10

Rk2     20

Rk3     -30

Rk4     -10

  表A

 

单号   收入   支出

Rk1     10       0

Rk2     20       0

Rk3      0        30

Rk4      0        10

  表B

 1 declare @t table(danhao nvarchar(20),amount int) 2 insert into @t 3 select 'PK1',10 UNION 4 select 'PK2',20 UNION 5 select 'PK3',-10 UNION 6 select 'PK4',-30  7 select * from @t 8 select danhao, 9 (case when amount>0 then amount else 0 end) as N'收入',10 (case when amount>0 then 0 else amount end) as N'支出'11 from @t

View Code

 

 

3.有一张表T_Scores,记录比赛成绩

Date                 Name   Score 
2008-8-8          拜仁       胜
2008-8-9          奇才       胜
2008-8-9          湖人       胜
2008-8-10        拜仁       负
2008-8-8          拜仁       负
2008-8-12        奇才       胜
 
要求输出下面的格式:
Name   胜     负
拜仁     1       2
湖人     1       0
奇才     2       0
 
 1 declare @t table(DateT datetime,name nvarchar(20),Score nvarchar(20)) 2 insert into @t 3 select '2008-8-8',N'拜仁',N'胜' union all 4 select '2008-8-8',N'奇才',N'胜' union all 5 select '2008-8-8',N'湖人',N'胜' union all 6 select '2008-8-8',N'拜仁',N'负' union all 7 select '2008-8-8',N'拜仁',N'胜' union all 8 select '2008-8-8',N'拜仁',N'胜' union all 9 select '2008-8-8',N'奇才',N'胜' union all10 select '2008-8-8',N'湖人',N'负'11 select name,12 SUM(case Score when N'胜' then 1 else 0 end)as N'胜',13 SUM(case Score when N'负' then 1 else 0 end)as N'负'14 from @t15 group by name

View Code

 

4.根据下图列表求和

idvalue
11
22
52
62
83
94

 

 

 

 

 

 

 

 

 1 declare @t table( id int ,value int ) 2 insert into @t 3 select 1, 1 4 union all 5 select 2, 2 6 union all 7 select 5, 2 8 union all 9 select 6, 210 union all11 select 8, 312 union all13 select 9, 414 15 select * from @t16 --1.按id 排序,取得所有的奇数 (单数) 行value之和17 18 select SUM (m. value) from(19 select ROW_NUMBER () over (order by id )row, id,value from @t)m20 WHERE m .row% 2=121 22 --2.取得所有id 为奇数的行 value之和23 select SUM (value) from @t where id% 2=1

View Code

 

 

 

5.行转列5.1与列转行5.2

5.1如下图所示

nameclassscore
张三语文74
张三数学83
张三物理93
李四语文74
李四数学84
李四物理94
 转换成
name语文数学物理
张三748393
李四748494
 1 declare @t table ( name varchar (10), 课程 varchar (10), score int ) 2  3 insert into @t 4 select ' 张三', '语文' ,74 5 union all 6 select ' 张三', '数学' ,83 7 union all 8 select ' 张三', '物理' ,93 9 union all10 select ' 李四', '语文' ,7411 union all12 select ' 李四', '数学' ,8413 union all14 select ' 李四', '物理' ,9415 16 select * from @t17 18 select name,19 max(case 课程 when '语文' then score else 0 end) 语文 ,20 max(case 课程 when '数学' then score else 0 end) 数学 ,21 max(case 课程 when '物理' then score else 0 end) 物理22 from @t23 group by name

View Code

 

5.2列转行

 1 declare @t table ( 姓名 varchar (10), 语文 int ,数学 int,物理 int) 2  3 insert into @t 4 select ' 张三', 74,83 ,93 5 union all 6 select ' 李四', 74,84 ,94 7  8 select * from 9 (10 select 姓名,课程 ='语文 ',分数 =语文 from @t11 union all12 select 姓名,课程 ='数学 ',分数 =数学 from @t13 union all14 select 姓名,课程 ='物理 ',分数 =物理 from @t15 )m

View Code

 

   后期等待多了之后再用心整理成一份Sql文档,现在题目还少,努力去涵盖面试中遇到的,谢谢观看。