面试经典考题(一):SQL部分

面试经典考题(一):SQL部分

(1)写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键, 注意:ID可能不是连续的。)

 

 

--定义临时表@A并为@A产生数据
declare @A table(id int identity(1,1),testNum int)
declare @i int
set @i=1
while @i<=300
begin 
insert into @A(testNum) values(@i)
set @i=@i+2
end 
--产生不连续的id(删除部分id)
delete @A where id=1
delete @A where id=10
delete @A where id=33
delete @A where id=40
delete @A where id=42
delete @A where id=99 
--解1: 选取@A表中前30条记录,用not in 找出剩下的部分,然后在剩下的部分取前10条既可以找到第30条到40条的记录
select top 10 * from @A where id not in (select top 30 id from @A) 
--解2:选取@A表中前30条记录,在取比前30条记录的最大id,然后再在大于id记录中取前10条
 select top 10 * from @A where id > (select max(id) from (select top 30 id from @A )as A) 

 

 (2)表假设表@A有100条记录则select select COUNT(*) from @A where testNum=testNum有多少条记录(testNum为@A中字段)

 

--题目:表@A中字段testNum,假设表@A有100条记录则select select COUNT(*) from @A where testNum=testNum有多少条记录
--定义临时表
declare @A table(id int identity(1,1),testNum int)
--定义临时变量
declare @i int
set @i=1
while @i<=15
begin 
insert into @A(testNum) values(@i)
insert into @A(testNum) values(@i+4)
set @i=@i+2;
end
--查询记录条数
select COUNT(*)from @A 
select COUNT(*) from @A where testNum=testNum;
--发现记录条数一样,那为什么呢?
--个人认为是由于select 是对@A表自身的投影,所以记录为@A的总记录

复制代码

(3)员工考勤表 A(id,Name,checkinTime),id是为员工编号,Name为员工姓名nvarchar类型,checkinTime为员工打开时间。8点为打卡时间 --打印迟到次数最多的员工信息并打印员工迟到最长一次迟到时间(假设每个员工迟到次数不一样,且每个员工每次迟到时间不一样) 

复制代码

--定义临时表
declare @A table(id char(5),name nvarchar(10),checkinTime datetime)
insert into @A values('00001','李华','2013-2-3 8:40')
insert into @A values('00001','李华','2013-2-4 9:50')
insert into @A values('00001','李华','2013-2-5 10:59')

insert into @A values('00002','陈美','2013-2-3 6:40')
insert into @A values('00002','陈美','2013-2-4 8:50')
insert into @A values('00002','陈美','2013-2-5 8:59')

insert into @A values('00003','林涛','2013-2-3 11:40')
insert into @A values('00003','林涛','2013-2-4 6:50')
insert into @A values('00003','林涛','2013-2-5 7:59')

select *from @A;
--打印所有员工迟到的总次数
select COUNT(*) as '迟到次数'  from @A where  DATEPART(hour, checkinTime)>=8 
--按员工id,姓名分组打印每个员工对应的迟到次数
select id,name, COUNT(*)as '迟到次数'  from @A where  DATEPART(hour, checkinTime)>=8 group by id,name;
---找出迟到次数最多的那个员工,并打印员工信息,打印迟到次数
  select top 1 id,name, COUNT(*)as '迟到次数'  from @A where  DATEPART(hour, checkinTime)>=8 group by id,name order by '迟到次数' desc
---在已找到的迟到次数最多的员工的所有迟到次数中找出迟到最长的时间。
select  id,(DATEPART(hour, checkinTime)) from @A where   DATEPART(hour, checkinTime)>=8  group by id  

复制代码

该题还没有写完,只考虑了小时,还有分钟的考虑,这种写法貌似会把句子写得很长,后续思考更好的解决办法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值