sql关于求成绩的面试题

table如下,共有5个科目,所有的题目都必须用一条语句处理:
+---------+-------------+------+
| name    |lesson      |mark  |
+---------+-------------+------+
| John    | Math        | 60   |
| Mike    | Eng         | 70   |
| Mark    | History     | 80   |
+---------+-------------+------+

1.有一科不及格的学生名单

2.不及格科目超过2门的学生名单

3.所有科目都不及格的学生名单

4.总分前三的所有学生名单(包括并列)

5.各科成绩最高的所有学生名单(包括并列)
答案--分析 --脚本
create table te (
name char(20) ,
lesson char(20),
mark float
)


insert into te values('john','Math',60);
insert into te values('john','Eng',50);
insert into te values('john','HIstory',56);

insert into te values('Mike','Eng',51);
insert into te values('Mike','Math',59);
insert into te values('Mike','HIstory',55);

insert into te values('Mark','Eng',71);
insert into te values('Mark','Math',89);
insert into te values('Mark','HIstory',95);

insert into te values('mm','Eng',61);
insert into te values('mm','Math',79);
insert into te values('mm','HIstory',85);

insert into te values('f','Eng',51);
insert into te values('f','Math',69);
insert into te values('f','HIstory',95);
select *from te;
--1.有一科不及格的学生名单
--先求出 < 60的,然后分组 统计 在having
select name as c from te where mark <60 group by name having count(*)=1

--2.不及格科目超过2门的学生名单
select name from te where mark <60 group by name having count(*) =2;

--3.所有科目都不及格的学生名单
select name, count(lesson) from te where mark < 60
group by name
having count(lesson) =
(select count(distinct lesson) lesson from te)
--4.总分前三的所有学生名单(包括并列)
SQLServer:
select top 3 name ,sum( isnull(mark,0)) as s_sum from te group by name order by s_sum desc ;
MYSql:
select  name ,sum( ifnull(mark,0)) as s_sum from te group by name order by s_sum desc limit 0,3 ;
select *from te;
--5.各科成绩最高的所有学生名单(包括并列)
--先使用分组求出每科的 Max
--然后join on 就ok 了
select t.name,t.lesson,t.mark from te t join (
select lesson, max(isnull(mark,0)) l_max from te group by lesson) tl on t.mark = tl.l_max;
 注意:处理空值 sqlserver:isnull 
mysql :ifnull
oracle :nvl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值