1. 程式人生 > >軟體測試面試題中的sql題目

軟體測試面試題中的sql題目

上海易號網路科技有限公司-----測試面試題之一

軟體測試面試題中的sql題目

1.
學生表(學生id,姓名,性別,分數)student(s_id,name,sex,score)
班級表(班級id,班級名稱)class(c_id,c_name)
學生班級表(班級id,學生id)student_class(s_id,c_id)
1.查詢一班得分在80分以上的學生
2.查詢所有班級的名稱,和所有版中女生人數和女生的平均分

題解:

1.select * from student where score> 80 and s_id
in( select sid from student_class where c_id=
(select c_id from class where c_name='一班' )) 2.select c.c_name,女生人數=sum(s.s_id),平均分= avg(s.score)from classes c innerjoin student_class sc on sc.c_id=c.c_id innerjoin students s on s.s_id=sc.s_idwhere s.sex= '女' group by c.c_name

2.一道SQL語句面試題,關於group by表內容:
info 表

date result

2005-05-09 win

2005-05-09 lose

2005-05-09 lose

2005-05-09 lose

2005-05-10 win

2005-05-10 lose

2005-05-10 lose

如果要生成下列結果, 該如何寫sql語句?

win lose

2005-05-09 2 2


 答案:

(1) select date , sum( case when result = "win" then 1 else 0 end ) as "win", 
sum(case when result = "lose" then 1 else 0 end) as "lose" from info group by date;
(2) select a.date, a.result as win, b.result as lose from
  (select date, count (result) as result from info where result = "win" group by date) as a
  join
  (select date, count (result) as result from info where result = "lose" group by date) as b

  on a.date = b.date;2.學生成績表(stuscore):

3.表中有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 else c end ) from table;

4.
有一張表,裡面有3個欄位:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按以下條件顯示出來(並寫出您的思路):?
大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。?
顯示格式:?
語文 數學 英語?

及格 優秀 不及格?

select
(case when 語文>=80 then '優秀'
when 語文>=60 then '及格'
else '不及格') as 語文,
(case when 數學>=80 then '優秀'
when 數學>=60 then '及格'
else '不及格') as 數學,
(case when 英語>=80 then '優秀'
when 英語>=60 then '及格'
else '不及格') as 英語,
from table

5.姓名:name 課程:subject 分數:score 學號:stuid
張三 數學 89 1

張三 語文 80 1

張三 英語 70 1

李四 數學 90 2

李四 語文 70 2

李四 英語 80 2

題解:

1.計算每個人的總成績並排名(要求顯示欄位:姓名,總成績)
答案:

select name,sum(score) as allscore from stuscore group by name order by allscore

2.計算每個人的總成績並排名(要求顯示欄位: 學號,姓名,總成績)
答案:

select distinct t1.name,t1.stuid,t2.allscore from stuscore t1,( select stuid,sum(score) as allscore from stuscore group by stuid)t2where t1.stuid=t2.stuidorder by t2.allscore desc

3.計算每個人單科的最高成績(要求顯示欄位: 學號,姓名,課程,最高成績)
答案:

select t1.stuid,t1.name,t1.subject,t1.score from stuscore t1,(select stuid,max(score) as maxscore from stuscore group by stuid) t2where t1.stuid=t2.stuid and t1.score=t2.maxscore

4.計算每個人的平均成績(要求顯示欄位: 學號,姓名,平均成績)
答案:

select distinct t1.stuid,t1.name,t2.avgscore from stuscore t1,(select stuid,avg(score) as avgscore from stuscore group by stuid) t2where t1.stuid=t2.stuid

5.列出各門課程成績最好的學生(要求顯示欄位: 學號,姓名,科目,成績)
答案:

select t1.stuid,t1.name,t1.subject,t2.maxscore from stuscore t1,(select subject,max(score) as maxscore from stuscore group by subject) t2where t1.subject=t2.subject and t1.score=t2.maxscore

6.列出各門課程成績最好的兩位學生(要求顯示欄位: 學號,姓名,科目,成績)
答案:

select distinct t1.* from stuscore t1 where t1.id in (select top 2 stuscore.id from stuscore where subject = t1.subject order by score desc) order by t1.subject

7.統計如下:學號 姓名 語文 數學 英語 總分 平均分
答案:

select stuid as 學號,name as 姓名,sum(case when subject=’語文’ then score else 0 end) as 語文,sum(case when subject=’數學’ then score else 0 end) as 數學,sum(case when subject=’英語’ then score else 0 end) as 英語,sum(score) as 總分,(sum(score)/count(*)) as 平均分from stuscoregroup by stuid,name order by 總分desc

*8.列出各門課程的平均成績(要求顯示欄位:課程,平均成績)
答案:

*select subject,avg(score) as avgscore from stuscoregroup by subject

9.列出數學成績的排名(要求顯示欄位:學號,姓名,成績,排名)
答案:

declare @tmp table(pm int,name varchar(50),score int,stuid int)

insert into @tmp select null,name,score,stuid from stuscore where subject=’數學’ order by score desc

declare @id int

set @id=0;

update @tmp set @[email protected]+1,[email protected]

select * from @tmp

oracle:

select DENSE_RANK () OVER(order by score desc) as row,name,subject,score,stuid from stuscore where subject=’數學’order by score desc

ms sql(最佳選擇)

select (select count(*) from stuscore t1 where subject =’數學’ and t1.score>t2.score)+1 as row ,stuid,name,score from stuscore t2 where subject =’數學’ order by score desc

10.列出數學成績在2-3名的學生(要求顯示欄位:學號,姓名,科目,成績)
答案:
select t3.* from(select top 2 t2.* from (select top 3 name,subject,score,stuid from stuscore where subject=’數學’order by score desc) t2 order by t2.score) t3 order by t3.score desc

11.求出李四的數學成績的排名
答案:

declare @tmp table(pm int,name varchar(50),score int,stuid int)insert into @tmp select null,name,score,stuid from stuscore where subject=’數學’ order by score descdeclare @id intset @id=0;update @tmp set @[email protected]+1,[email protected] * from @tmp where name=’李四’

12.統計如下:課程 不及格(0-59)個 良(60-80)個 優(81-100)個
答案:
select subject, (select count(*) from stuscore where score<60 and subject=t1.subject) as 不及格,(select count(*) from stuscore where score between 60 and 80 and subject=t1.subject) as 良,(select count(*) from stuscore where score >80 and subject=t1.subject) as 優from stuscore t1 group by subject

13.統計如下:數學:張三(50分),李四(90分),王五(90分),趙六(76分)
答案:

declare @s varchar(1000)set @s=”select @s [email protected]+’,’+name+'(‘+convert(varchar(10),score)+’分)’ from stuscore where subject=’數學’ set @s=stuff(@s,1,1,”)print ‘數學:’[email protected]

14.計算科科及格的人的平均成績
答案:
select distinct t1.stuid,t2.avgscore from stuscore t1,(select stuid,avg(score) as avgscore from stuscore group by stuid ) t2,(select stuid from stuscore where score<60 group by stuid) t3 where t1.stuid=t2.stuid and t1.stuid!=t3.stuid;

  select name,avg(score) as avgscore from stuscore s where (select sum(case when i.score>=60 then 1 else 0 end) from stuscore i where i.name= s.name)=3 group by name

1. 用一條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)
 select name from table group by name having min(fenshu)>80