SQL经典面试题及答案

1.一道SQL语句面试题,关于group by
 表内容:
 2005-05-092005-05-092005-05-092005-05-092005-05-102005-05-102005-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
 2.请教一个面试中遇到的SQL语句的查询问题
 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
 ------------------------------------------
 select (case when a>b then a else b end ),
 (case when b>c then b esle c end)
 from table_name
 
3.面试题:一个日期判断的sql语句?
 请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)
 ------------------------------------------
 select * from tb where datediff(dd,SendTime,getdate())=0
 
4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):  
    大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。  
        显示格式:  
        语文              数学                英语  
        及格              优秀                不及格    
 ------------------------------------------
 select
 (case when 语文>=80 then '优秀'
         when 语文>=60 then '及格'
 else '不及格' end) as 语文,
 (case when 数学>=80 then '优秀'
         when 数学>=60 then '及格'
 else '不及格' end) as 数学,
 (case when 英语>=80 then '优秀'
         when 英语>=60 then '及格'
 else '不及格' end) as 英语 from table
 
5.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的
 A: select top 10 * from A where ID not in (select top 30 ID from A) 

 B: select top 10 * from A where ID in (select top 40 ID from A order by ID) order by ID desc

 C: select top 10 * from (select top 40 * from A order by ID )as A order by ID desc 

 D: select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by ID ) T) order by ID

6.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号
   select ID from table1 Where LastUpdateDate = (from MAX(LastUpdateDate) from table1)
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      5         null       8      
 04     null        9        null
------------------------------------------
 1)
select a.部门dep,b.业绩yj  as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份' 
from (select 部门dep from table2 group by 部门dep) a 
left join 
(select 部门dep,业绩yj from table1 where  月份mon='一月份' group by 部门dep,业绩yj) b 
 on a.部门dep = b.部门dep   
 left join 
(select 部门dep,业绩yj from table1 where  月份mon='二月份' group by 部门dep,业绩yj) c
  on a.部门dep = c.部门dep
left join 
(select 部门dep,业绩yj from table1 where  月份mon='三月份' group by 部门dep,业绩yj) d 
 on a.部门dep = d.部门dep   
 group by a.部门dep,b.业绩yj ,c.业绩yj ,d.业绩yj
2)
select a.部门dep, 
 sum(case when b.月份mon='一月份' then b.业绩yj else null end) as '一月份',  
 sum(case when b.月份mon='二月份' then b.业绩yj else null  end) as '二月份',
  sum(case when b.月份mon='三月份'then b.业绩yj else null  end) as '三月份'
from table2 a 
left join table1 b on a.部门dep=b.部门dep  
group by a.部门dep
8.华为一道面试题
 一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
 ------------------------------------------
 select id, Count(*) from tb group by id having count(*)>1
 select * from(select count(ID) as count from table group by ID)T where T.count>1
 
9.表形式如下: 
Year      Salary 
2000       1000
2001       2000 
2002       3000
2003       4000 

想得到如下形式的查询结果

Year      Salary 
2000      1000 
2001      3000
2002      6000
2003      10000

sql语句怎么写? 
连接查询 
select b.year, sum(a.salary) salary from hello a, hello b where a.year <= b.year group BY b.year
 
子查询 
select year ,(select sum(salary) from hello as B where B.year<=A.year ) from hello as A
 
 10.用一条SQL语句查询出每门课都大于80分的学生姓名
 
 name   kecheng   fenshu
 张三     语文       81
 张三     数学       75
 李四     语文       76
 李四     数学       90
 王五     语文       81
 王五     数学       100
 王五     英语       90
 
A: select distinct name from table where name not in (select distinct name from table where fenshu<=80)

B: select name from table group by name having min(fenshu)>80 
11.学生表 如下:
 自动编号   学号    姓名  课程编号  课程名称  分数
  1      2005001  张三   0001      数学    69
  2      2005002  李四   0001      数学    89
  3      2005001  张三   0001      数学    69
 删除除了自动编号不同,其他都相同的学生冗余信息
 
  delete tablename where 自动编号 not in(select min(自动编号) from tablename group by 学号,姓名,课程编号,课程名称,分数)
 
12. 一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.
 你先按你自己的想法做一下,看结果有我的这个简单吗?
 
答:select a.name, b.name
 from team a, team b
 where a.name < b.name
 
 13.请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。
 AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。
 数据库名:JcyAudit,数据集:Select * from TestDB
 
答:select a.*
 from TestDB a
 ,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b
 where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur
 
************************************************************************************
 
14.面试题:怎么把这样一个表儿
 year   month amount
 1991   1     1.1
 1991   2     1.2
 1991   3     1.3
 1991   4     1.4
 1992   1     2.1
 1992   2     2.2
 1992   3     2.3
 1992   4     2.4

 查成这样一个结果

 year  m1  m2   m3   m4
 1991 1.1 1.2  1.3  1.4
 1992 2.1 2.2  2.3  2.4

 select year,
 (select amount from   aaa m where month=1   and m.year=aaa.year) as m1,
 (select amount from   aaa m where month=2   and m.year=aaa.year) as m2,
 (select amount from   aaa m where month=3   and m.year=aaa.year) as m3,
 (select amount from   aaa m where month=4   and m.year=aaa.year) as m4
 from aaa   group by year
 
 
 
这个是ORACLE  中做的:
 select * from (select name, year b1, lead(year) over
 (partition by name order by year) b2, lead(m,2) over(partition by name order by year) b3,rank()over(
 partition by name order by year) rk from t) where rk=1;
 

 

转载于:https://www.cnblogs.com/rwh871212/p/4846793.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值