mysql中有student,course,scorse三张表,计算每个人单科的最高成绩(学生,课程,成绩)

让学生在每个科目中获得最高分。
selectsid,cid,max(score)fromscoregroupbycid;然后将学生表和课程表一起查询,得到科目名和学生名。
编写一个SQL查询:select*from(selects.sid)。
,s.realname,a.cid,a.mscorefromstudentassrightjoin(selectsid,cid,max(score)asmscorefromscoregroupbycid)asaona.sid=s.sid)asa1leftjoin((selectc.coursename,c.cidfromcourseascrightjoin(selectsid,cidasmscorefromscoregroupbycid)asaona.cid=c.cid))asb1ona1.cid=b1.cid;

Mysql45题

数据准备:学生表学生:

科目表课程

教师表教师

分数表SC

45题预览:问题1.查询“01”学生信息以及成绩高于“02”课程的课程成绩1.1查询“01”课程和“02”课程同时存在时1.2查询“01”课程是否存在,“02”课程是否存在可能不存在(即使存在也不会显示为null)1.3“01”课程不存在,查询“02”课程是否存在存在。
2、查询平均分60分以上学生的学号、学生姓名、平均成绩。
3、查询SC表4中存在成绩的学生信息。
询问一切。
同学的学号、学生姓名、所选科目总数、所有科目总成绩(无成绩显示为空)4.1查看成绩学生信息5.姓“李”6.询问已学习的学生“张三”7.查询老师所教的同学信息查询未修完全部科目的学生信息。
查询与学号“01”学生至少有一门相同科目的学生信息9、查询与学号“01”学生有相同科目的其他学生信息》同学信息10.3.老师所教课程的学生姓名11.查询两门及以上课程不及格的学生人数、姓名、平均成绩。
12.按降序搜索分数低于60分的“01”课程。
基于学生信息13的平均分。
所有学生的课程成绩和平均成绩均按降序显示。
14.查询各科目的最高分、最低分、平均分。
按以下格式显示:课程ID、课程名称、最高分、最低分。
分数、平均分、通过率、平均率、优秀率,优秀率为:>=60,平均率为:70-80,优秀率为:80-90,优秀率为:>=90课程号,我需要输出选修课的数量。
如果学生人数相同,请按照科目编号从小到大的顺序按15。
显示按分数排序的排名。
如果重复评分,则排名为空。
15.1显示按每个科目的分数排序的排名。
16.运行查询。
学生总成绩及排名如果重复总成绩,排名将为空。
缺失16.1查询学生总成绩并排序。
如果总分重复,排名不保留。
计算每个科目每个分数范围内的学生人数:课程编号、课程名称、[100-85]。
]、[85-70]、[70-60]、[60-0]、百分比18、查询各科目成绩前三名的记录。
19、查询每门课程的学生人数。
20、查询只修了两门课的学生人数和姓名。
21.查询课程数量。
男生女生22.查询名字中含有“风”字的学生信息23.查询同名同性别的学生列表,统计同名学生的数量。
24、查询1990年出生的学生名单。
25、查询每门课程的平均成绩。
结果如下:如果平均分相同,则平均分降序排列,课程编号升序排列26。
如果平均分是85。
查询所有≥的学生的学号、姓名、平均分。
27、查询课程名称为“数学”且成绩低于60分的学生姓名和成绩。
28、查询所有学生的课程和成绩(部分学生没有成绩,没有选课)29、查询70分及以上的课程名称、课程名称、成绩。
30.查询不及格课程。
31、查询课程号为01、成绩在80分以上的学生的成绩。
编号和姓名32.查找每门课程的学生人数33.假设成绩没有重叠,找到表现最好的学生及其查询成绩信息。
34.假设存在重叠。
成绩请联系“张三”老师。
所教课程的学生中,成绩为最高学生信息,成绩35.查询不同课程中成绩相同的学生的学号、课程号、学生成绩36.每门课程最高成绩查询排名靠前2名学生37人。
统计每门课程的注册学生人数(仅统计5名或以上学生的课程)。
38.获取至少修过两门课程的学生的学号。
39、查询已修完所有课程的学生信息。
40.查询每个学生的年龄。
仅根据西历计算。
41、按照出生日期计算。
如果当前月份和日期<出生年份月份和日期,则年龄减少42。
查看本周哪些学生过生日。
学生43.查询下周生日的学生44.查询本月生日的学生45.查询下个月生日的学生

详情1.成绩高的“01”课程查询“02”课程学生信息和课程成绩,理清思路:(1)学生信息和课程成绩成绩分布对应student表和sc表,所以他们需要有关联。

(2)由于我们需要比较同一学生的不同分数,因此我们需要将分数表sc关联起来。

(3)从哪里过滤

1.1您想查询“01”课程和“02”课程同时存在的情况吗?同时开设“01”和“02”课程意味着什么?这是否指的是cid='01'和cid='02'?

请澄清您的想法:选择的是同一个学生。
课程01和课程02。

1.2查询“01”课程存在但“02”课程可能不存在的情况(如下图)。
如果不存在,则如何使用leftjoin将课程显示为nullcasewhen--no

1.3“01”课程正在查询课程“02”是否存在的情况?不存在但存在思路:找到不存在的课程01的记录后,将其关联(Innerjoin)查找02是否存在课程

2.查询平均分60分以上学生的学号、学生姓名、平均成绩。
分数在于想法。
SC表。
学生姓名位于学生表2中。
您可以通过学号SID进行关联。
首先查询sc表,获取平均分大于60分的学生信息。

ERROR1111(HY000):组功能无效如果遇到此错误,您应该考虑使用groupby+having+aggregate函数。

一些错误尝试:

成功查询:

下一步:将学号sid与students表关联起来。

结果一目了然。
注意:关联多表时,字段归属表必须清晰。
如果您正在查询avg(score)等聚合函数的结果,我们建议您重命名它。

我有一个问题。
以上两种写法的区别在于子查询中avg(score)的名称是否改变,但结果却明显不同。
我想听听原因。
?你没注意到某个地方吗?

答:MySQL对于groupby有特殊的规则。
使用groupby时,除了groupby后面的列名外,select语句只能包含聚合函数。
如果groupby后面除了列名或聚合函数之外还有其他列名,SQL将只输出第一行,如果是“*”则只输出记录的第一行。
示例:

总结:如果使用groupby+aggregation函数,可以在运行查询时进行聚合,避免查询其他字段时只看到一条记录,最好只查询该函数(列名)。
+groupby之后)。
注意:必须查询聚合函数。
3.SC表中查询包括成绩在内的学生信息思路:(1)首先确定表:sc表和student表

发现重名。
(2)使用groupbysid去除重复的学生信息查询。
具体来说:

注意:更精确的写法:(1)首先创建一个查询分组字段的子查询。

(2)对(1)中的字段运行嵌套查询。

注:groupby

4.查询学号、学生姓名、所有学生选修的课程总数。
,所有课程的总成绩(没有成绩的课程显示为空)(1)确定相关表的范围:Student,SC(2)想法:

修复:(2)

(3)

您也可以考虑先连接到查询,但仍然建议这样做。
我将解释如何做到这一点。

4.1查看成绩和学生信息(1)首先确定要使用的表范围sc和学生(2)首先获取成绩表上的学生ID。

(3)根据ID查询学生信息。

这和第三个问题是一样的吗?答:思路基本一样。
有用的答案:这个想法是检查student表中的ID是否在sc表中的ID中(即确定它是否存在)。

5.查询姓“李”的教师人数。

6.查询学过“张三”的老师数量。
老师教的学生的信息(1)使用了4个表(2)4个嵌套

7.查询未修完所有科目的学生信息(1)关键字:'所有科目'课程'在课程表中,'同学信息'在学生表中这两个。
是西德我们还需要sc表,因为我们需要将其与.(2)如何筛选“所有课程”?限制课程数量,从表格中获取课程总数

b.统计课程数量。

c.接下来,从sc查询中排除课程编号=3的学生SID。

d.3)查询学生SID对应的学生信息

8.与学号“01”学生同一学习的学生信息(1)关键词:“至少一门课程”...学号“01”学生的课程、“学号01学生”‘课程’学号01’--课程表,‘同学信息’--学生表(2)思路:a.01号同学学的是哪门课?

01号同学学了3门课剩下的学生学习的课程数量大于0就足够了,因为事实证明他们已经学习了所有三门课程。

b.除了studentID01之外的学生ID是多少?

c.如何查询其他学生的课程信息进行分组并筛选出学生?数字大于0的ID,根据该ID查询学生信息。

9.查询与01号学号同科的其他学生信息(1)确定相关表格。
“01号学生修读的课程”-sc表。
“其他学生信息”-学生表(2)思路:a、01号学生学习了哪些课程?

01号学生学习了3门课程,明白了。
你有总数吗?

一共有三门课程,01号同学都学完了。
c.查询剩余课程数为3的学生ID。

d.接下来,在students表中跟踪查询学生信息中对应的ID。

10.查询未上过“张三”所教课程的学生。
学生姓名(1)确定相关表。
“Mr.Harisantid”——老师,“Mr.Harisan'sinstructionscid”——课程“学生接受指导”——sc;“学生姓名”——学生。
首先查一下你学过张三博士的哪些课程,然后再看看Notin。
(2)思路:a.从教师表中查询张三老师的tid。

b.从课程表中查询张三老师的指令ID。

c.来自研究生的SID的查询。
使用cid=02

d使用notin查询没有学过张三课程的学生信息。

11查询两次或两次以上考试未通过的学生信息。
学习课程。
人数、姓名、平均分

2”score<60>3确定对应表格。
name'--student表(2)思路:a.从sc表中查询分数小于60的sid,根据sid分组计数,得到si。
不及格课程数为2门以上d,sname,avg_score

12搜索“01”课程成绩小于60的学生信息(1)根据关键字“'01课程成绩小于”确定相关表。
60'--sc表“学生信息”--学生(2)想法与实现:a.首先,sc表01中分数低于60的课程查询学生信息并按分数降序排序。

b.根据(1)中的sid向学生查询学生信息。

13.显示所有学生的成绩以及基于平均成绩的所有课程的平均成绩。
根据关键词确定相关表“平均成绩”——SC表(2)思路及实现过程:a.首先按照学生的平均成绩降序展示SC。

分数也会显示。
每个学生每个科目的成绩是多少?答案:是的,将avg_score列添加到sc表中。

14.查询各科目的最高分、最低分、平均分。
显示格式如下:课程ID、课程名称、最高分、最低分、平均分、通过率、平均率、优秀率,优秀通过率>=60,平均为70-80,优秀为80-90,优秀应该输出课程编号和选择>=90。
学生人数如果学生人数相同,则查询结果按照课程编号升序排列。
(1)根据关键字确定适用的表。
'年级'--sc;'课程名称'--课程;(2)思路与实现:a.

b.如何计算不同的百分比答案:考虑条件计数技巧的情况。

根据您的问题要求更改格式。

15.按每个科目的分数排序并显示排名。
空座排名(1)根据关键词确定相关表格。
c表(2)思路:使用赋值变量@i给a添加一列。

b.

不要指定内部联接(笛卡尔积)。
每行都与一个相关条件相关联。

注意:

有一个student表,有学号,姓名,科目,成绩等字段,请写一条sql语句,算出学生的总分数?

Mysql示例:

1创建t_student表

CREATETABLE`t_student`(`id`intNOTNULLAUTO_INCRMENT.,--自增ID`studentID`varchar(20)NULL,--学号`studentName`varchar(20)NULL,--姓名`subject`varchar(50)Null,科目`score`doublenull,-gradePrimarykey(`ID`)主键设置

2.填充数据

3查询

SELECTt_student.studentID,t_student.studentName,(SELECTb.scoreFROMt_studentASbWHEREb.studentID=t_student.studentIDANDb.`subject`='中文')ASchineseScore,(SELECTTb.分数来自t_studentASbWHEREb.studentID=t_student.studentIDANDb.`subject`='数学')ASmathScore,(SELECTb.scoreFROMt_studentASbWHEREb.studentID=t_student.studentIDANDb.`subject`='English')ASenglishScore,SUM(t_student.score)AS总得分FROMt_studentGROUPBYt_student.studentIDORDERBY总得分DESC