发表于: 2017-04-20 13:41:59
1 1524
一天居然不能提交两次日报,只好把正常日报放在文末
这不是日报,这是一个关于SQL的语法练习
来自我们的群,感谢Java-1738提供。
create table Student(S varchar(10),Sname varchar(10),Sage datetime,Ssex nvarchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('08' , '王菊' , '1990-01-20' , '女');
create table Course(C varchar(10),Cname varchar(10),T varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
create table Teacher(T varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
create table SC(S varchar(10),C varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);
以上是插入数据的代码,与原文件不同的是mySQL需要加“;”以及第2,3表中一处“,”应改为空格
下面是题,一共40道,第一感觉是大同小异,决定做下面这4题
--18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
--19、按各科成绩进行排序,并显示排名
--20、查询学生的总成绩并进行排名
--21、查询不同老师所教不同课程平均分从高到低显示
题19,sc.C改02,03
select sc.C,student.Sname,sc.score
from sc inner join student
on sc.S=student.S
where sc.C='01'
order by sc.score DESC;
题20
select student.Sname,sum(score) as sumScore
from sc inner join student
on sc.S=student.S
group by sc.S
order by sumScore DESC;
题21
select avg(score) as avgScore,sc.C,course.Cname,teacher.Tname
from sc,course,teacher
where sc.C=course.C and course.T=teacher.T
group by sc.C
order by avgScore DESC;
题18我看到是有点懵
课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
没后面4个率,易得下解
select course.C,course.Cname,
MAX(sc.score) as maxSc,MIN(sc.score) as minSc,AVG(sc.score) as avgSc
from sc,course
where sc.C=course.C
group by sc.C;
passRate,CRate,BRate,ARate四个率解决一个,其他是一样的
妄想一步登天,失败,先来个简单的
select C,
count(*) as passCount
from sc
where score>=60
group by C;
及
select C,
count(*) as CCount
from sc
group by C;
我无法将他们组合到一起,我几乎认为我要失败了,我用了1个小时完成组合之前的部分,然后1个小时我都毫无进展,直到我看到了这个函数(W3C的SQL教程没提)
SUM(case...then..else..end)
这应该能解决了。
select course.C,course.Cname,
MAX(sc.score) as maxSc,MIN(sc.score) as minSc,AVG(sc.score) as avgSc,
sum(case when sc.score>=60 then 1 else 0 end)/count(*) as passRate
from sc,course
where sc.C=course.C
group by sc.C;
最后
获益良多,再次感谢Java-1738。时间关系没写ABCRate但是一样的,不过我还是有疑问能不能18用我最开始想的组合相除的方式来做,它的语法是怎样的?跪求回复
今日完成
1、进行了mySQL语法的学习及练习,详见上一日报。
2、添加表“enrolledlist(已报名名单)”如图
此表由stuID对student表产生唯一对应关联,对stuID建立唯一索引。
关于外键的建立,详见问题1
3、JDBC初步成功,完成MysqlDemo如图,计划改为SQLbasic以做DAOImpl的通用部分
4、学习Junit,尝试对MysqlDome写一个test失败,只好写一个简单的(水一下),如下:
如果有一个有构造函数的对象,我可以测试其有返回值的函数,但是一个无构造函数的对象或void的函数能用Junit测试吗,这需要我进一步的学习。
明日计划
oh,我昨天计划的是什么来着,mdzz根本没完成啊
写完简单的DAOImpl,编写对应的单元测试代码
收获
SQL select及各函数熟悉一次,JDBC主要是插入语句的值格式试坑成功,Junit初步学习。
问题
1、一般来说,应该是需要对stuID建立外键约束到student.ID。纠结查阅网上资料,外键并不会带来多少方便,而且极大降低了大数据下的运行速度。不过目前在我能力之外,不做深入,暂不建外键。
2、假想我明天需要对DAOImpl进行单元测试,返回值都有,但构造函数是没有的,我该如何进行?
3、非正常篇的最后问题。
另:我可能需要一+本书,求推荐。服务器我们是推荐买谁的,什么操作系统的呢?
评论