MySQL-School综合查询

School综合查询

  • 查询所有考试平均成绩在80分以上的学生的姓名

下面是成绩表

  1. 找到平均成绩在80分以上的studentid SELECT studentid AVG(score) FROM grade GROUP BY studentid HAVING SCORE >= 80;

  2. 通过找到的studentid在student表中进行多表查询

 SELECT s.sname s.studentid,AVG(g.score) AS AvgScore FROM grade g,student s WHERE s.studentid=g.studentid GROUP BY studentid HAVING AvgScore >= 80;

  • 查询所有外语考试成绩在80分以上的学生的姓名

下面是class表

  1. 先判断是几张表连接(这里是三张表。英语课程存在于course表中,成绩存在于grade表中,学生姓名存在sttudent表中)

  2. 先在course和grade两表中进行双表查询得到对应的 cname和 AVG(score)

  3. 然后再去student表中进行连接 得到对应的sname

 #在这里我们简单说一下这种复杂查询语句的思路
 #一:先写单表,并且 SELECT 的内容为 * ,需要 SELECT 的内容最后在从临时表中去写
 SELECT * FROM grade WHERE courseid='C01' AND score >= 80;  #这里先用courseid='C01'来代替一下cname='外语',等把class表连接上了之后,再改过来就好了
 #二:一张表一张表的加,从单表加到双表,查询结果是否成功,再由双表加到三表
 SELECT * FROM student s,grade g,course c WHERE s.studentid = g.studentid AND g.courseid = c.courseid AND c.cname='外语' AND g.score >= 80;
 #三:最后查询我们想要的内容
 SELECT s.sname c.cname g,score FROM grade g,student s,course c WHERE g.studentid = s.studentid AND g.courseid = c.courseid AND c.cname='外语' AND g.score >= 80;

  • 查询所有C01课程的成绩在80以上的学生的学号,姓名和成绩

 #在这里我们分析,courseid studentid sname grade只需要两张表student和grade就够了
 SELECT s.studentid s.sname g.grade FROM student s,grade g WHERE s.studentid = g.studentid AND g.courseid='C01' AND g.score >= 80;

  • 查询所有男生中数学成绩最高的学生

 #首先 男生 为sex,需要考虑student表
 #其次 数学 为course,需要考虑class表
 #然后 成绩 为grade,需要考虑grade表
 SELECT * FROM student s,grade g,course c WHERE s.studentid = g.studentid AND g.courseid = c.courseid AND s.sex='男' AND c.cname='数学' ORDER BY g.score DESC LIMIT 1; 

  • 查询所有女生的语文平均成绩

 #女生 为sex,需要student表
 #语文 为course,需要course表
 #成绩 为grade,需要grade表
 SELECT ROUND(AVG(score),1) FROM student s,course c,grade g WHERE s.studentid = g.studentid AND g.courseid = c.courseid AND s.sex='女' AND c.cnaem='语文';

其中 ROUND(m,n) 表示对m采取小数的四舍五入,小数的个数就是n的大小

  • 查询测试二班所有学生的平均成绩

 #测试二班 为class,需要class表
 #成绩 为grade,需要grade表
 #但是由于class表和grade表没有主外键关联,class表只与student表有关,所以这里还需要student表
 SELECT AVG(score) FROM student s,grade g,class c
 WHERE s.studentid=g.studentid AND s.classid=c.classid AND c.classname='测试二班' 

  • 查询成绩最好的前十名学生的所在班级

 #使用平均成绩来判断
 #第一步:先找平均分前十的分数
 SELECT AVG(score) AS AvgScore FROM grade GROUP BY grade.studentid ORDER BY AvgScore LIMIT 10;
 #然后向下扩展,上面找到平均分了之后,只需要将对应的班级名称查询出来对应上就好了,但是要查询出对应的classname我们需要将student表也引进来,因为grade表中没有与班级有关的,所以我们只能从grade表中去找studentid或classid与class表关联。
 #又因为只有studen表中的classid才和class表中的classid有主外键关系,而student表和grade表的关联的向又是
 ​
 #上面我们已经找到了排名前是的平均分,通过对studentid进行分组,可以得到每一个studentid对应的AvgScore,然后下面要引进classname,但是因为grade与class表并没有主外键关联,因此这个时候就会形成笛卡尔积,只有student表与class通过classid进行主外键关联,所以,我们也需要将student表引进,从而通过这个来防止class表与grade表形成笛卡尔积
 ​
 SELECT c.classname AVG(g.score) AS AvgScore FROM grade g,student s,class c WHERE s.studentid = g.studentid AND s.classid = c.classid GROUP BY g.studentid ORDER BY AvgScore DESC LIMIT 10; 
 #当然,我们也可以对查询的结果班级进行一下去重,因为排名前10的学生有可能会有部分人在一个班里
 SELECT DISTINCT(classname) FROM (SELECT c.classname AVG(g.score) AS AvgScore FROM grade g,student s,class c WHERE s.studentid = g.studentid AND s.classid = c.classid GROUP BY g.studentid ORDER BY AvgScore DESC LIMIT 10) AS temp;

  • 查询班级学生数量最少的班级名称

 #只需要对班级进行分组,然后对每一个组里面的学生行数进行统计,就是没个班级的人数,最后,把统计到的人数结果进行升序(默认排序方式)最上面的1个就是人数最小的班级人数
 SELECT classid COUNT(studentid) AS stunum FROM student WHERE GROUP BY classid  ORDER BY stunum LIMIT 1; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值