题目描述:查询评价成绩大于等于60分的学生编号、学生姓名和学生成绩
select stu.sid,stu.sname,sc1.cid,sc1.score,tmp.avg_scorefrom student stuinner join(-- 因为是按sid作为分组,而这个分组只有唯一的一个平均分,因此可以sid和avg(score)同时出现select sid,avg(score) as avg_scorefrom scgroup by sid) as tmpon stu.sid = tmp.sidinner join sc sc1on sc1.sid = stu.sidwhere sc1.score >= tmp.avg_score;

使用group by的注意事项
注意group by sid 以后相同的sid只会出现一次,虽然一个sid有多个score,但也只会出现第一个socre
select sid,score,avg(score) as avg_score from sc group by sid

题目描述:查询sc表存在成绩的学生信息
注意可以通过group by去重
select student.*from scinner join studenton sc.sid = student.sid-- group by 可以进行去重复group by sc.sid;
select student.*from (-- 先把有成绩的学生信息通过group by进行去重,得到的sid都是有成绩的学生idselect sid from sc group by sid) sc_tmpleft join Studenton sc_tmp.sid = student.sid

题目描述:查询所有同学的学生编号,学生姓名,选课总数,所有课程的总成绩(没有则显示null)
思路1:先找出有成绩的学生,找出没有成绩的学生,通过union进行联合
-- 已选课程的同学select s.sid,s.sname,COUNT(s.sid) as total_count,SUM(c.score) as total_scorefrom student sinner join sc con s.sid = c.sidgroup by s.sidunion-- 没选课程的同学select s.sid,s.sname,0 as total_count, null as total_scorefrom student swhere s.sid not in( select distinct sc.sid from sc)
思路2:
对sc表先按sid进行聚合处理,处理完以后用student和聚合处理后的sc表进行左连接left join
select stu.sid,stu.sname,tmp.total_count,tmp.total_scorefrom Student stuleft join(-- 对sc表先按sid进行聚合,第二步用student和聚合的结果进行左连接select sid, count(sid) as total_count,sum(score) as total_scorefrom scgroup by sc.sid) tmpon stu.sid = tmp.sid;

题目描述:查询有成绩的学生信息
思路:成绩表sc表作为主表来left join student表,注意通过group by去重
select s.*from sc cinner join student son c.sid = s.sid-- 不增加group by会有很多重复的结果group by s.sid;
思路: 先对sc表进行过滤去重,然后驱虫后的结果left join 学生表
select s.*from(select sidfrom scgroup by sid) tmpleft join student son tmp.sid = s.sid;

题目描述:统计李姓老师的数量
select count(*) as 李姓老师数量from Teacher twhere t.Tname like '李%'
题目描述:查询学过张三老师授课的学生信息
-- 找到学生信息select student.*from studentwhere student.sid in(-- 找到选修了张三老师教授课的学生编号select sc.sidfrom scwhere sc.cid in(-- 找到张三老师教的课程编号select course.cidfrom Coursewhere course.tid in(-- 找到张三老师的教师编号select tidfrom Teacherwhere tname = '张三')));
题目描述:查询没有学全所有课程的学生信息
第1步:查询一共有多少门课程
第2步:
查询学生课程关系表按学生分组以后每个学生学了几门课程
第3步:
过滤出第2步中不等于第1步中课程数的结果第4步:最后查询学生信息表
-- 选了课程但没有选全的select student.*from studentinner join(select sc.sid,count(sc.sid) as cntfrom scgroup by sc.sid-- 这里要用having来过滤而不能用where过滤having cnt != (select count(*) as cnt from course)) tmpon student.sid = tmp.sidunion-- 一门课程都没选的select student.*from studentwhere student.sid not in(select sid from sc group by sid)

题目描述:查询至少有一门课与01同学所学相同的学生信息
select student.*from studentwhere student.sid in(select sc.sidfrom scwhere sc.cid in(select distinct sc.cidfrom scwhere sc.sid = '01') and sc.sid != '01')

文章转载自梁霖编程工具库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




