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
<think>好的,用户想要查找与SQL面试题相关的成绩计算示例和数据库查询内容。根据用户提供的引用资料,特别是引用[1]和引用[3],里面提到了学生、课程、成绩、教师四张表的经典场景,以及数据分析师常考的SQL问题。需要结合这些信息来组织回答。 首先,用户可能需要具体的示例问题,比如如何计算平均成绩、排名或者最高分。根据引用[1]中的数据库结构,应该围绕学生表、课程表、成绩表来构建查询。例如,计算每个学生的平均成绩,或者找出每门课程的最高分,这些都是常见的面试题。 接下来,需要确保回答符合用户的要,包括使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并且结构清晰。还要生成相关问题,可能涉及优化方法、窗口函数的使用,或者性能分析,这些在引用[2]和引用[4]中提到的数据库面试题部分和关系型数据库的优缺点有关。 另外,用户提到的成绩计算可能需要使用聚合函数如AVG、SUM,以及GROUP BY子句,这些都是SQL基础操作,属于引用[3]中的基础篇内容。同时,窗口函数如RANK()是进阶部分,符合高频考点,需要包含在示例中。 需要检查是否有遗漏点,比如多表连接的使用,JOIN操作在涉及多个表时是必须的。例如,学生和成绩表的连接,课程和成绩表的连接,可能还需要教师表的信息,但根据用户的问题,可能主要集中在成绩计算,所以教师表可能暂时不需要涉及。 确保每个示例都有代码块,并且语法正确。例如,计算平均成绩SQL语句,使用JOIN和GROUP BY,然后计算排名的时候使用窗口函数RANK()。同时,注意引用标记,在每个相关部分的末尾添加[^1]、[^3]等。 最后,生成的相关问题需要围绕SQL面试题展开,可能包括性能优化、索引使用、复杂查询等,结合引用[2]和引用[4]提到的内容,比如事务处理、读写性能,或者窗口函数的其他应用。 总结步骤: 1. 分析用户需,确定需要提供成绩计算的SQL示例。 2. 根据引用资料中的表结构,构建相关查询。 3. 使用正确的LaTeX格式,确保代码块正确。 4. 添加引用标记在适当位置。 5. 生成相关问题,覆盖基础、进阶和优化内容。</think>[用户可见层] # SQL面试题成绩计算与查询示例 根据学生-课程-成绩经典场景,以下为常见的SQL成绩计算面试题及实现方法: ## 一、基础查询示例 ### 1. 计算学生平均成绩 ```sql SELECT s.student_id, s.student_name, AVG(sc.score) AS avg_score FROM students s JOIN scores sc ON s.student_id = sc.student_id GROUP BY s.student_id, s.student_name; ``` 关键点:使用`JOIN`连接学生表与成绩表,`AVG()`函数计算平均值,`GROUP BY`分组统计[^1][^3] ### 2. 查询每科最高分 ```sql SELECT c.course_name, MAX(sc.score) AS max_score FROM courses c JOIN scores sc ON c.course_id = sc.course_id GROUP BY c.course_id, c.course_name; ``` $$ \text{最大值计算公式:} \max(S) = \{x \in S | \forall y \in S, y \leq x\} $$ ## 二、进阶查询示例 ### 3. 成绩排名查询(窗口函数) ```sql SELECT student_id, course_id, score, RANK() OVER (PARTITION BY course_id ORDER BY score DESC) AS rank FROM scores; ``` 使用`RANK()`窗口函数实现课程内成绩排名,解决TopN问题 ### 4. 多条件统计(CASE语句) ```sql SELECT course_id, COUNT(CASE WHEN score >= 90 THEN 1 END) AS excellent, COUNT(CASE WHEN score < 60 THEN 1 END) AS failed FROM scores GROUP BY course_id; ``` 统计每门课程优秀率与挂科率,$优秀率=\frac{excellent}{total}$[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值