(头哥)多表查询与子查询

目录

第1关:查询每个学生的选修的课程信息

第2关:查询选修了“数据结构”课程的学生名单

第3关:查询“数据结构”课程的学生成绩单

第4关:查询每门课程的选课人数

第5关:查询没有选课的学生信息

第6关:查询学生所学课程平均分超过80分的学生信息

第7关:找出每个学生超过他所有的选修课程的平均成绩的课程

第8关:查询“程序设计基础”课程成绩最高的学生信息

第9关:查询每个同学的总学分


第1关:查询每个学生的选修的课程信息

任务描述:

本关任务:查询每个学生的选修的课程信息,显示sno、sn、cn、ct,并按ct降序排列

分析:sno、sn在学生表(s)中,cn、ct在课程表(c)中,因此我们要将这两张表连接起来,但由于这两张表无直接联系,因此我们需要通过选修表(sc)将s表和c表连接起来。我们可以使用内连接,将这三张表(s、sc、c)连接起来,s与sc的连接条件为:s.sno=sc.sno,sc与c的连接条件为:sc.cno=c.cno

内连接:

select 字段1, 字段2,... from 表1 inner join 表2 on 连接条件;

select 字段1, 字段2,... from 表1, 表2 where 连接条件;

题解: 

select s.sno, s.sn, c.cn, c.ct from s 
 inner join sc on s.sno = sc.sno 
 inner join c on sc.cno = c.cno 
 order by c.ct desc;

第2关:查询选修了“数据结构”课程的学生名单

本关任务:查询选修了“数据结构”课程的学生名单,显示sno、sn,按学号升序排序

分析:sno、sn在学生表(s)中,题目要求查询选修了“数据结构”的学生名单,因此我们要查询楚“数据结构”的课程号(使用子查询),再通过课程号找到选修了“数据结构”的学生学号(在sc表中查询选修课程为“数据结构”课程号的学生),从而查询出选修了“数据结构”课程的学生名单

题解:

 select s.sno,s.sn from s inner join sc on s.sno = sc.sno 
 where sc.cno = (select cno from c where cn = '数据结构') 
 order by s.sno;

第3关:查询“数据结构”课程的学生成绩单

本关任务:查询“数据结构”课程的学生成绩单,显示sno、sn、score,按成绩降序排列

分析:本关与第2关类似,先查询出“数据结构”的课程号,即可通过课程号查询出学生的学号、分数、姓名

题解:

 select s.sno, s.sn, sc.score from s inner join sc on s.sno=sc.sno 
 where sc.cno = (select cno from c where cn = '数据结构') 
 order by sc.score desc;

第4关:查询每门课程的选课人数

本关任务:查询每门课程的选课人数,以中文显示课程号、课程名称、选课人数,没有学生选的课程也要显示,按课程号升序排列。

分析:统计选课人数,则需要使用聚合函数(count()),而任务要求查询每门课程的选课人数,则需要使用分组查询,分组的依据为课程号,且题目还要求没有学生选的课程也要显示,因此我们不能使用内连接来查询,而要使用外连接

外连接:

左外连接:select 字段 from 表1 left outer join 表2 on 连接条件;

右外连接:select 字段 from 表1 right outer join 表2 on 连接条件;

题解:

select c.cno as '课程号',c.cn as '课程名称',count(s.sno) as '选课人数' 
from c left outer join sc on c.cno=sc.cno 
left outer join s on s.sno=sc.sno 
group by c.cno;

第5关:查询没有选课的学生信息

本关任务:查询没有选课的学生信息,显示sno、sn,按学号升序排列

分析:若学生没有选课,则选修表(sc)中cno为空或是sc中无该学生选课信息,因此,我们可以使用左外连接查询出这些没有选课的学生

题解:

select s.sno,s.sn from s left outer join sc on s.sno=sc.sno 
 where sc.cno is null; 

第6关:查询学生所学课程平均分超过80分的学生信息

本关任务:查询学生所学课程平均分超过80分的学生信息,以中文显示学号、姓名、平均成绩。按学号升序排列

分析:所学课程平均分需要使用聚合函数(avg()),而任务要求查询学生所学课程平均分超过80分的学生信息,因此需要使用分组查询分组条件为学号,由于平均分在分组之后计算出,因此需要使用having 来查询平均分超过80分的学生

题解:

select s.sno as '学号', s.sn as '姓名', avg(sc.score) as '平均成绩' 
from s inner join sc on s.sno=sc.sno group by sc.sno 
having avg(sc.score)>=80 
order by s.sno;

第7关:找出每个学生超过他所有的选修课程的平均成绩的课程

本关任务:找出每个学生超过他所有的选修课程的平均成绩的课程,显示sno、sn、cn、score,按sno和cn升序排列

分析:要找出每个学生超过他所有的选修课程的平均成绩的课程,我们首先要求出学生所选修课程的平均成绩,再找出其超出平均成绩的课程,因此我们可以使用自连接来查询学生超过他所有的选修课程的平均成绩的课程,再通过课程号查询该学生其他信息

题解:

select s.sno,s.sn,c.cn,sc.score 
from sc inner join s on sc.sno=s.sno 
inner join c on sc.cno=c.cno 
where sc.score >= (select avg(score) from sc as b where b.sno=sc.sno) order by s.sno,c.cn;

第8关:查询“程序设计基础”课程成绩最高的学生信息

本关任务:查询“程序设计基础”课程成绩最高的学生信息,显示sno、sn、score

分析:我们首先要找到“程序设计基础”课程中成绩最高的学生学号,使用聚合函数(max())找出选修课程为“程序设计基础”中成绩最高的学号,再查询学生信息

题解:

 select s.sno,s.sn,sc.score from s 
 inner join sc on s.sno=sc.sno 
 where sc.score = (select max(score) from sc inner join c on sc.cno=c.cno where c.cn='程序设计基础');

第9关:查询每个同学的总学分

本关任务:查询每个同学的总学分,成绩大于等于60才能拿到学分,以中文显示学号、姓名、总学分,以学号升序排列

分析:

要查询每个同学的总学分,其中也可能会有学分为0的情况,因此我们要使用外连接,由于只有成绩大于等于60才能拿到学分,因此我们在查询总学分时,要使用子查询,使用聚合函数(sum()),并通过条件 sc.score>=60查出总学分,由于要查询每个同学的总学分,因此需要使用分组查询,分组条件为学号

题解:

 select s.sno as '学号', s.sn as '姓名', 
  (select sum(c.credit) from sc inner join c on sc.cno=c.cno 
  where sc.score>=60 and sc.sno=s.sno) as '总学分' 
 from s left outer join sc on s.sno=sc.sno 
 left outer join c on sc.cno=c.cno 
 group by s.sno;

  • 34
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
### 回答1: SQL Server中的聚合函数可以在查询中使用,用于对数据进行汇总和计算。常见的聚合函数包括SUM、AVG、COUNT、MAX和MIN等。 在使用聚合函数时,需要注意以下几点: 1. 聚合函数只能用于SELECT语句中的SELECT列表或HAVING子句中。 2. 聚合函数可以对一列或多列数据进行计算,也可以对所有行进行计算。 3. 聚合函数可以与GROUP BY子句一起使用,用于对分组后的数据进行计算。 4. 聚合函数可以嵌套使用,用于进行复杂的计算。 例如,以下查询使用SUM函数计算销售总额: SELECT SUM(SalesAmount) AS TotalSales FROM Sales 以下查询使用AVG函数计算平均销售额,并按照产品类型进行分组: SELECT ProductType, AVG(SalesAmount) AS AvgSales FROM Sales GROUP BY ProductType 以上就是SQL Server中聚合函数在查询中的使用方法。 ### 回答2: 在SQL Server中,聚合函数是一种非常常用的查询函数,它们可以对表中的数据进行统计和计算,例如计算平均值,求和,最大值,最小值,计数等等。这些函数通常用于查询语句的SELECT子句中,在其中计算返回的结果的总和、平均值等信息。 SQL Server支持多种聚合函数,其中一些常用的包括SUM、AVG、COUNT、MAX和MIN。这些函数将返回与查询有关的表格中的列中的数据值的聚合值。例如,如果您要计算特定分组的平均订单金额,则可以使用AVG函数将此计算公式嵌入到查询中。 此外,聚合函数还可以用作表达式或复合列。使用SUM函数计算表基于当前筛选的数据值的总和是一个很好的例子。另外,你还可以使用聚合函数将特定条件下的总数计算输出。 聚合函数在查询中的使用有诸多优点。它们可以帮助我们更快速地进行数据统计和分析,简化我们的工作流。同样地,聚合函数不仅计算传入的数据集的总和,并且还可以用于计算分组的数据。这些值可能是代表某个客户的订单,也可能是某个时间段里发生的订单总数。 因此,学习和使用SQL Server的聚合函数是数据库查询中必不可少的能力,掌握聚合函数的使用将大大提高用户的工作效率和精度。在应用中,聚合函数的使用帮助数据分析人员了解具体的市场趋势和消费习惯,具有重要的商业价值。 ### 回答3: SQL Server中的聚合函数是一种非常有用的工具,它们可以对结果集进行各种计算和聚合。聚合函数是在SELECT语句中使用的,它们通常用于计算一系列值的总和、平均值、最大值或最小值等。在SQL Server中最常用的聚合函数包括SUM、COUNT、AVG、MAX和MIN等。 首先我们来看一下SUM函数,这个函数用于计算一个数值列的总和,例如: SELECT SUM(SaleAmount) FROM Sales; 这条SQL语句将计算销售表中所有销售金额的总和,并将结果返回。COUNT函数用于计算一个表中行的数量,例如: SELECT COUNT(*) FROM Sales; 这条SQL语句将返回Sales表中所有行的数量。AVG函数用于计算数值列的平均值,例如: SELECT AVG(SaleAmount) FROM Sales; 这条SQL语句将计算销售表中所有销售金额的平均值,并将结果返回。MAX和MIN函数用于计算数值列的最大和最小值,例如: SELECT MAX(SaleAmount) FROM Sales; SELECT MIN(SaleAmount) FROM Sales; 这些函数都可以做到很多比较有用的事情。例如,可以使用它们来查找最高、最低、平均、总和或其他统计量等。聚合函数也可以结合GROUP BY子句使用,以根据特定的列对结果集进行分组聚合计算。例如: SELECT CustomerName, SUM(SaleAmount) FROM Sales GROUP BY CustomerName; 这条SQL语句将返回按客户名称分组的销售总额。 总之,SQL Server中的聚合函数是非常有用的工具,可以帮助我们对结果集进行各种计算和聚合操作。熟练掌握聚合函数的使用方法,可以大大提高我们的查询效率和准确度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠枬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值