一、创建如下表
学生表:student
字段名称 字段类型 约束
sno varchar2(10) 主键
sname varchar2(20)
sage number(2)
ssex varchar2(5)
教师表:teacher
tno varchar2(10) 主键
tname varchar2(20)
课程表:course
cno varchar2(10) 与tno联合做主键
cname varchar2(20)
tno varchar2(20)
成绩表:sc
sno varchar2(10) 与cno联合做主键
cno varchar2(10)
score number(4,2)
create table student( sno varchar2(10) primary key, sname varchar2(20), sage varchar2(20), ssex varchar2(5) ) create table teacher( tno varchar2(10) primary key, tname varchar2(20) ) create table course( cno varchar2(10), cname varchar2(20), tno varchar2(20) , primary key(cno,tno) ) create table sc( sno varchar2(10), cno varchar2(10), score number(4,2), primary key(sno,cno) )
二、为各表输入数据
insert into student values ('s001','张三',23,'男'); insert into student values ('s002','李四',23,'男'); insert into student values ('s003','吴鹏',25,'男'); insert into student values ('s004','琴沁',20,'女'); insert into student values ('s005','王丽',20,'女'); insert into student values ('s006','李波',21,'男'); insert into student values ('s007','刘玉',21,'男'); insert into student values ('s008','萧蓉',21,'女'); insert into student values ('s009','陈萧晓',23,'女'); insert into student values ('s010','陈美',22,'女'); commit; insert into teacher values ('t001', '刘阳'); insert into teacher values ('t002', '谌燕'); insert into teacher values ('t003', '胡明星'); commit; insert into course values ('c001','J2SE','t002'); insert into course values ('c002','Java Web','t002'); insert into course values ('c003','SSH','t001'); insert into course values ('c004','Oracle','t001'); insert into course values ('c005','SQL SERVER 2005','t003'); insert into course values ('c006','C#','t003'); insert into course values ('c007','JavaScript','t002'); insert into course values ('c008','DIV+CSS','t001'); insert into course values ('c009','PHP','t003'); insert into course values ('c010','EJB3.0','t002'); commit; insert into sc values ('s001','c001',78.9); insert into sc values ('s002','c001',80.9); insert into sc values ('s003','c001',81.9); insert into sc values ('s004','c001',60.9); insert into sc values ('s001','c002',82.9); insert into sc values ('s002','c002',72.9); insert into sc values ('s003','c002',81.9); insert into sc values ('s001','c003','59'); commit;
三、按下列要求完成查询
1、查询每门课程被选修的学生数。
SELECT cno,COUNT(sno) FROM sc GROUP BY cno;
2、查询出只选修了一门课程的全部学生的学号和姓名。
SELECT sno,sname FROM student WHERE sno in( SELECT sno FROM sc GROUP by sno HAVING COUNT(cno)=1 );
3、查询男生、女生人数。
SELECT count(ssex) as 男生人数 FROM student WHERE ssex='男'; SELECT count(ssex) as 女生人数 FROM student WHERE ssex='女';
4、查询姓“张”的学生名单。
SELECT * FROM student WHERE sname LIKE '张%';
5、查询同名同姓学生名单,并统计同名人数。
SELECT sname,count(*) as NUM FROM student GROUP BY sname HAVING COUNT(*)>1
6、1981 年出生的学生名单。
7、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列。
SELECT c.cname,c.cno,AVG(sc.score) FROM course c,sc WHERE c.cno = sc.cno GROUP BY c.cname,c.cno ORDER BY AVG(sc.score) DESC,c.cno ASC;
8、查询平均成绩大于85 的所有学生的学号、姓名和平均成绩。
SELECT s.sno,s.sname,AVG(score) FROM student s,sc WHERE s.sno=sc.sno GROUP BY s.sno,s.sname HAVING AVG(score)>85;
9、统计每门课程的学生选修人数(超过10 人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
SELECT cno,COUNT(*) FROM sc GROUP BY cno HAVING COUNT(*)>10 ORDER BY COUNT(*) DESC,cno;
10、查询各科成绩最高和最低的分,以如下形式显示:课程ID,最高分,最低分。
SELECT cno as 课程ID,MAX(score) as 最高分,min(score) as 最低分 FROM sc GROUP BY cno;
11、按各科平均成绩从低到高和及格率的百分数从高到低顺序。
SELECT c.cno,c.cname,round(avg(sc.score),2) avg ,round( (SELECT COUNT(*) FROM sc WHERE cno = c.cno and score>=60)/( SELECT COUNT(*) FROM sc WHERE cno= c.cno )*100,2)||'%' AS path_rate FROM course c,sc WHERE c.cno = sc.cno GROUP BY c.cname,c.cno ORDER BY avg, path_rate DESC;
12、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]。
SELECT c.cno AS 课程ID,c.cname AS 课程名, SUM(CASE WHEN sc.score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS "[100-85]", SUM(CASE WHEN sc.score BETWEEN 70 AND 84 THEN 1 ELSE 0 END) AS "[84-70]", SUM(CASE WHEN sc.score BETWEEN 60 AND 69 THEN 1 ELSE 0 END) AS "[69-60]", SUM(CASE WHEN sc.score BETWEEN 0 AND 59 THEN 1 ELSE 0 END) AS "[<60]" FROM course c,sc WHERE c.cno = sc.cno GROUP BY c.cno,c.cname;