1. 程式人生 > >面試經典考題(一):SQL部分

面試經典考題(一):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 @[email protected]+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 @
[email protected]
+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  

複製程式碼

該題還沒有寫完,只考慮了小時,還有分鐘的考慮,這種寫法貌似會把句子寫得很長,後續思考更好的解決辦法。