本文纯属个人见解,是对前面习学的总结,如有描述不确正的地方还请高手指正~
由于被拉去行进建模赛比,小生的sql训练划计直接被延后了三天。趁着今晚没课(逃了)将这一套
题集行进一下训练,强固下之前的习学。须要说明的是,训练所针对的据数都是来自上一盘文章中的
http://blog.csdn.net/kiritor/article/details/8790214。据数未几,也就是生学、课程的关相息信。
1、查询“C001”课程比“C002”课程绩成高的全部生学的息信。
☞ 在from子句面后用使子查询
select s.*,a.cno,a.score from student s, ( select * from score where cno='C001' )a, ( select * from score where cno='C002' )b where a.sno=b.sno and a.score>=b.score and s.SNO = a.SNO ;
☞ 用使关相子查询方法实现
select * from student s, score a where a.cno ='C001' and exists ( select * from score b where b.cno='C002' and a.score >=b.score and a.sno = b.sno ) and s.sno =a.sno ;
2、查询均平绩成大于60分的全部生学的息信,括包其均平绩成
☞ 第一种方法
select s.sno,t.sname, avg(s.score) from student t, score s where t.sno=s.sno group by (s.sno,t.sname) having avg(s.score)>60 ;
☞ 第二种方法
select t.sno ,t.sname, m.avg_s from student t, ( select s.sno, avg(s.score) avg_s from score s group by s.sno having avg(s.score)>60 ) m where m.sno = t.sno ;
3、查询全部同窗的姓名、学号、总绩成、选课数
/*思绪:可以道知的是选课数、总绩成可以通过 子查询中的置内函数查询出来的*/ --首先查询出总绩成与选课数 select sum(score) ,count(cno) from score group by sno; --后之查询生学的学号姓名等息信就牵强附会了 select t.* ,tmp.sum_sc,tmp.sum_cn from student t, ( select sno, sum(score) sum_sc ,count(cno) sum_cn from score group by sno ) tmp where t.sno = tmp.sno ;
4、查询姓为“刘”的教师的息信
select * from teacher where tname like '刘%'; select count(*) from teacher where tname like '刘%';
5、查询学过“王燕”教师课的同窗的学号、姓名
思考:首先查询出王燕教师传授的课程的编号
☞ 第一种方法
select t.* ,s.cno,s.score from student t, score s where s.cno in ( select distinct cno from course c,teacher t where c.tno = ( select tno from teacher where tname='王燕' ) ) and t.sno = s.sno ;
☞ 第二种方法
select * from student st where st.sno in ( select distinct sno from score s join course c on s.cno=c.cno join teacher t on c.tno=t.tno where tname='王燕' ) ;
6、查询学过“c001”并且也学过编号“c002”课程的同窗的学号、姓名
--通过连接的方法实现 select * from score s join score a on s.sno = a.sno join student st on st.sno = s.sno where s.cno='C001' and a.cno = 'C002' and st.sno = s.sno ;
7、查询课程编号‘COO2’的绩成比课程编号为'C001'的绩成低的生学的全部息信。
呃,是不是有种似曾相识的感到呢,和第一题没有区分嘛,不过我们用采子查询的
方法来实现。
select * from student t join score a on t.sno = a.sno join score b on t.sno = b.sno where a.cno = 'C002' and b.cno ='C001' and a.score <= b.score ;
哈哈用使连接的方法看起来更加简略吧!
8、查询全部课程绩成都小于60分的生学的学号等息信
先来看看一种经常误以为是确正的查询吧!小生是在网上找的题库
案答什么的感到感到有些题问啊,还是自己斟酌吧
错误的查询:
select st.*,s.score from student st join score s on st.sno=s.sno join course c on s.cno=c.cno where s.score <60
很轻易的可以道知这个查询只要有小于60分的课程都市查到,这其实不符合目题的要求
下一种查询方法:
思考全部的课程小于60,就是不存在某个生学的某门课程大于60分
select t.* from student t where not exists ( select * from score s where s.score >60.9 and t.sno = s.sno ) and t.sno in ( select sno from score ) ;
9、查询没有学完全部课程的生学的息信
思考::
1、我们该应道知统共的课程数
2、再在score表中查询,按照sno分组、并
去重,加添having子句
select t.sno,t.sname from student t left join score on t.sno=score.sno group by t.sno,t.sname having count(score.cno)< ( select count(distinct cno) from course ) ;
10、查询至少有一门课与学号为‘S001’所选的课一样的
思绪:首先查询出学号为S001生学所选
的全部课程的息信,后之行进判断
select t.sno,t.sname ,score.cno from student t left join score on t.sno= score.sno where score.cno in ( select distinct cno from score where sno='S001' ) and t.sno <>'S001' ;
第一阶段的训练就到这儿了。
文章结束给大家分享下程序员的一些笑话语录: 面试官:熟悉哪种语言
应聘者:JAVA
面试官:知道什么叫类么
应聘者:我这人实在,工作努力,不知道什么叫累
面试官:知道什么是包?
应聘者:我这人实在 平常不带包 也不用公司准备了
面试官:知道什么是接口吗?
应聘者:我这个人工作认真。从来不找借口偷懒
面试官:知道什么是继承么
应聘者:我是孤儿没什么可以继承的
面试官:知道什么叫对象么?
应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。
面试官:知道多态么?
应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系??