首页 > 数据库 >【SQL】进阶57题

【SQL】进阶57题

时间:2023-06-13 22:11:39浏览次数:51  
标签:进阶 57 学生 score student SQL 查询 id select

1. 题号1142 查询姓“李”的教师数量

select count(t_id) from teacher where t_name like '李%'; 
/* 
  1. 大水题,无脑写

2. 题号1143 查询课程编号为”01“的课程比”02“的课程成绩高的所有学生的学号(尝试了两种写法,未能解决,很蓝瘦~~~)

select sc1.s_id 
	from 
		(select s_id , s_score from score where score.c_id = '01') sc1 
	join
		(select s_id , s_score from score where score.c_id = '02') sc2
	on sc1.s_id = sc2.s_id
	  where sc1.s_score > sc2.s_score
/* 
  1. 使用子查询从成绩表中获取课程编号为'01'和'02'的学生编号和分数,然后将这两个子查询结果进行联结,
  并筛选出成绩比课程'02'高的学生的学号。

3. 题号1144 查询平均成绩大于60分的学生的学号和平均成绩

select s_id , avg(s_score) from score
	group by s_id
	having avg(s_score) > 60;
/*
  1. 从score表中选择学生编号(s_id)和成绩的平均值(AVG(s_score))作为结果列。
  2. 使用GROUP BY子句将数据按照学生编号(s_id)进行分组。
  3. 对每个学生分组计算其成绩的平均值。
  4. 使用HAVING子句筛选出平均成绩大于60的学生。

4. 题号1145 查询所有学生的学号、姓名、选课数、总成绩

select student.s_id , s_name, ifnull(count(score.c_id) , 0) , ifnull(sum(score.s_score) , 0) from student
	left join score on student.s_id = score.s_id
	group by student.s_id
/*
  1. 通过左连接(LEFT JOIN),将student表与score表连接在一起,以便获取每个学生的成绩信息。
  2. 使用COUNT函数计算每个学生所拥有的成绩数量,并使用SUM函数计算每个学生的总成绩。
  3. 如果没有匹配的成绩记录,这两个聚合函数的结果将为NULL。
  4. 使用IFNULL函数将NULL结果替换为0,以确保结果中显示为0而不是NULL。

5. 题号1146 查询没学过“张三”老师课的学生的学号、姓名

select s_id , s_name from student
	where s_id not in (
		select student.s_id from student
				left join score on student.s_id = score.s_id
						where c_id = (
													select c_id from course where t_id = (select t_id from teacher where t_name = '张三')
													)
										)
/*
  1. 从student表中选择学生编号(s_id)和学生姓名(s_name)作为结果列。
  2. 使用子查询来获取所有学过“张三”老师课程的学生的学生编号。
      子查询中的第一个子查询是从teacher表中选择教师编号(t_id),以获得“张三”老师的教师编号。
      第二个子查询是从course表中选择课程编号(c_id),以获取与“张三”老师相关的课程编号。
      最后一个子查询是从score表中选择学生编号(s_id),以获取学过与“张三”老师课程相关的学生编号。
  3. 主查询中使用NOT IN子句来选择在学生表(student)中学号不在子查询结果中的学生的学号和姓名。

6. 题号1147 查询学过“张三”老师所教的所有课的同学的学号、姓名

select student.s_id , student.s_name from student
		left join score on student.s_id = score.s_id
				where c_id = (
											select c_id from course where t_id = (select t_id from teacher where t_name = '张三')
											)
/*
  1. 这题就是上一题的核心部分,详见上一题思路。

7. 题号1148 查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名

select student.s_id , s_name from student
	left join (select * from score where c_id = '01') sc1 on student.s_id = sc1.s_id
	left join (select * from score where c_id = '02') sc2 on sc1.s_id = sc2.s_id
	where sc1.s_id = sc2.s_id;
/*
  1. 从student表中选择学生编号(s_id)和学生姓名(s_name)作为结果列。
  2. 使用左连接(LEFT JOIN)将student表与两个子查询连接起来。
      第一个子查询选择了score表中课程编号为'01'的所有记录(即学生参加的'01'课程成绩)。
      第二个子查询选择了score表中课程编号为'02'的所有记录(即学生参加的'02'课程成绩)。
  3. 在连接过程中,通过student.s_id = sc1.s_id将学生表与第一个子查询的结果连接起来,
      再通过sc1.s_id = sc2.s_id将第一个子查询的结果与第二个子查询的结果连接起来。
      这样,将具有相同学生编号的记录连接在一起。
  4. 最后,通过WHERE子句过滤出满足条件sc1.s_id = sc2.s_id的记录,即同时参加了'01'课程和'02'课程的学生。
  5. 返回满足条件的学生的学生编号(s_id)和学生姓名(s_name)作为查询结果。

8. 题号1149 查询课程编号为“02”的总成绩

select  c_id , sum(s_score) from score where c_id = '02';
/*
  大水题

9. 题号1150 查询所有课程成绩小于60分的学生的学号、姓名

select distinct student.s_id , s_name from student
	left join score on student.s_id = score.s_id
	where s_score < 60 or s_score is null
/*
  1. 注意,我写了半天发现漏看题目细节了,需要考虑学生缺考没有成绩的情况,还要去重。
  2. 从student表中选择学生编号(s_id)和学生姓名(s_name)作为结果列。
      使用左连接(LEFT JOIN)将student表与score表连接起来。通过student.s_id = score.s_id将两个表关联起来。
  3. 在连接后的结果上应用过滤条件。过滤条件是s_score < 60或s_score为空值的记录。
  4. 使用DISTINCT关键字确保返回的结果中没有重复的学生记录。
  5. 返回满足条件的学生的学生编号(s_id)和学生姓名(s_name)作为查询结果。

10. 查询没有学全所有课的学生的学号、姓名

select student.s_id , s_name from student
	where student.s_id not in (
		select s_id from score
			group by s_id
				having count(c_id) >= (select count(c_id) from course)
)
/*
select student.s_id , s_name from student
	where student.s_id in (
		select s_id from score
			group by s_id
				having ifnull(count(c_id) , 0) < (select count(c_id) from course) 
)
  1. 见鬼了,我只是把我的条件反向描述,就过了。
  2. 使用NOT IN运算符来排除满足子查询条件的学生。
  3. 子查询通过分组计数(COUNT)来统计每个学生学习的课程数量,然后与总课程数量进行比较。
  4. 如果学生学习的课程数量大于或等于总课程数量,那么该学生被视为学习了所有课程。
  5. 主查询中的NOT IN运算符将排除满足该条件的学生,返回剩余的学生。

更多题解持续更新

标签:进阶,57,学生,score,student,SQL,查询,id,select
From: https://www.cnblogs.com/gouziweisuidanerfei/p/17478826.html

相关文章

  • 论c++实现sql连接
    寻找关于c++对sql连接的过程非常艰辛。今天要做一个简单项目,要求在远程sql上实现对数据的实时模拟,每五分钟进行一次随机产生数据并写入。在此之前我并没有用过代码实现sql连接的经历,在翻阅无数资料后,终于实现了使用visualstudio对mysql的连接。第一步,添加mysql的依赖文件,在v......
  • MySQL索引
    一:索引的声明及使用索引是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的影响就愈发重要。索引优化应该是对查询性能优化最有效的手段,创建一个真正最优的索引经常需要重写SQL查询语句。要理解MySQL中索引......
  • 记录一个MySQL中order by 和 limit 连用导致分页查询不生效的坑
    具体现象和这位同学的一致,具体的解决办法也是参考这位同学的做法参考文章地址:https://www.cnblogs.com/yuluoxingkong/p/10681583.html......
  • CodeStar2023年春第11周周赛普及进阶组
    T1:等差数本题难度中等,公差等于\(0\)的等差数只含一种数码,公差不等于\(0\)的等差数只有几百个。所以本题的方针是先把公差不等于\(0\)的等差数都找出来。在公差等于\(0\)和公差不等于\(0\)的两类中分别找大于\(n\)的最小树,两者较小的就是答案。T2:炼金工坊补充道具本......
  • mysql 8.0.32 视图中文无法过滤
    mysql8.0.32视图中采用unionall或union合并获取结果时,含有中文的字段过滤失效会提示类似如下的信息Warning|1300|Cannotconvertstring'\xE5\xAE\xA2\xE6\x88\xB7...'fromutf8mb4tobinary这是此版本bug.在对派生表使用where条件时,如果对应值超过128(ascii值),对......
  • mysql一些小知识点
    mysql的三值逻辑mysql使用的是三值逻辑:TRUE FALSE UNKNOWN。任何与null值进行的比较都会与第三种值UNKNOWN做比较。这个“任何值”包括null本身。所以mysql提供了isnull和isnotnull两种操作来对null做特殊判断因此,在进行select查询时,如果查询到的值有为空的时候......
  • 工作记录_mysql_AND优先级高于OR优先级
    1.错误示例SELECT t.task_department_name, COUNT(*)total_count, SUM(CASEWHENstatus='done'THEN1ELSE0END)ASfinish_count, SUM(CASEWHENstatus<>'done'THEN1ELSE0END)ASunfinish_countFROM`t_task`t--WHEREtask_typ......
  • MySQL字符索引没用上问题
    某一天,接口突然502,运维同学说没有可用的PHP进程了,看监控说是这个接口夯住了,导致请求进不来,临时把这个接口给返回了200(PS:线上这个接口没有实际作用,所以这么操作了);给了慢查询的SQL,用explain看了下,发现竟然没有用到创建的索引,此时数据库的量有大概150万行,对SQL里where字段加了双引......
  • vue3进阶——组件基础
    组件允许我们将UI划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构,这和我们嵌套HTML元素的方式类似,Vue实现了自己的组件模型,使我们可以在每个组件内封装自定义内容与逻辑。定义组件当使用构建步骤时,我们一般......
  • [推荐]ORACLE SQL:经典查询练手第二篇(不懂装懂,永世饭桶!)
    [推荐]ORACLESQL:经典查询练手第二篇(不懂装懂,永世饭桶!)——通过知识共享树立个人品牌。  本文与大家共同讨论与分享ORACLESQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与......