```--学生表CREATETABLE`Student`(`s_id`VARCHAR(20),`s_name`VARCHAR(20)NOTNULLDEFAULT'',`s_birth`VARCHAR(20)NOTNULLDEFAULT'',`s_sex`VARCHAR(10)NOTNULLDEFAULT'',PRIMARYKEY(`s_id`));--课程表CREATETABLE`Course`(`c_id`VARCHAR(20),`c_name`VARCHAR(20)NOTNULLDEFAULT'',`t_id`VARCHAR(20)NOTNULL,PRIMARYKEY(`c_id`));--教师表CREATETABLE`Teacher`(`t_id`VARCHAR(20),`t_name`VARCHAR(20)NOTNULLDEFAULT'',PRIMARYKEY(`t_id`));--成绩表CREATETABLE`Score`(`s_id`VARCHAR(20),`c_id`VARCHAR(20),`s_score`INT(3),PRIMARYKEY(`s_id`,`c_id`));--插入学生表测试数据insertinto Student values('01','赵雷','1990-01-01','男');insertinto Student values('02','钱电','1990-12-21','男');insertinto Student values('03','孙风','1990-05-20','男');insertinto Student values('04','李云','1990-08-06','男');insertinto Student values('05','周梅','1991-12-01','女');insertinto Student values('06','吴兰','1992-03-01','女');insertinto Student values('07','郑竹','1989-07-01','女');insertinto Student values('08','王菊','1990-01-20','女');--课程表测试数据insertinto Course values('01','语文','02');insertinto Course values('02','数学','01');insertinto Course values('03','英语','03');--教师表测试数据insertinto Teacher values('01','张三');insertinto Teacher values('02','李四');insertinto Teacher values('03','王五');--成绩表测试数据insertinto Score values('01','01',80);insertinto Score values('01','02',90);insertinto Score values('01','03',99);insertinto Score values('02','01',70);insertinto Score values('02','02',60);insertinto Score values('02','03',80);insertinto Score values('03','01',80);insertinto Score values('03','02',80);insertinto Score values('03','03',80);insertinto Score values('04','01',50);insertinto Score values('04','02',30);insertinto Score values('04','03',20);insertinto Score values('05','01',76);insertinto Score values('05','02',87);insertinto Score values('06','01',31);insertinto Score values('06','03',34);insertinto Score values('07','02',89);insertinto Score values('07','03',98);```-- 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 SELECT*from(SELECT s_id,s_score from score where c_id =01)as t1,(SELECT s_id,s_score from score where c_id =02)as t2 where t1.s_id = t2.s_id and t1.s_score >t2.s_score;-- 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数SELECT*from(SELECT s_id,s_score from score where c_id =01)as t1,(SELECT s_id,s_score from score where c_id =02)as t2 where t1.s_id = t2.s_id and t1.s_score < t2.s_score
-- 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩SELECT stu.s_name, t1.s_id,t1.avg FROM(SELECT s_id,avg(s_score)as avg FROM score GROUPBY s_id HAVINGavg(s_score)>=60)as t1 ,student as stu where stu.s_id = t1.s_id
-- 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
-- (包括有成绩的和无成绩的)SELECT stu.s_name,t1.s_id,t1.avg from(SELECT s_id,AVG(s_score)as avg from score GROUPBY s_id HAVING avg <60)as t1 ,student as stu where stu.s_id = t1.s_id
-- 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩SELECT stu.s_name,t1.s_id,t1.count,t1.sum from student as stu,(SELECT s_id,count(c_id)as count,SUM(s_score)as sum FROM score GROUPBY s_id)as t1 where t1.s_id = stu.s_id
-- 6、查询"李"姓老师的数量 SELECTCOUNT(t_name)as'数量'from teacher where t_name like'李%'
-- 7、查询学过"张三"老师授课的同学的信息 SELECT s_name,s_sex,s_birth from student where s_id in(SELECT s_id from score where c_id =(SELECT c_id from course where t_id =(SELECT t_id from teacher where t_name like'张三')))-- 8、查询没学过"张三"老师授课的同学的信息 SELECT s_name,s_birth,s_sex from student where s_id notin(SELECT s_id from score where c_id =(SELECT c_id from course where t_id =(SELECT t_id from teacher where t_name ='张三')))-- 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息select dd.id,stu.s_name,stu.s_birth,stu.s_sex from(SELECT t1.s_id as id from(SELECT s_id from score where c_id =01)as t1,(SELECT s_id from score where c_id =02)as t2 where t1.s_id = t2.s_id)as dd ,student as stu
where dd.id = stu.s_id
-- 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息SELECT t1.s_id,stu.s_name,stu.s_birth,stu.s_sex FROM(SELECT s_id FROM score where c_id =01)as t1,(SELECT s_id FROM score where s_id notin(SELECT s_id FROM score where c_id =02)GROUPBY s_id)as t2,student as stu where t1.s_id = t2.s_id and stu.s_id = t1.s_id
-- 11、查询没有学全所有课程的同学的信息 SELECT s_id,s_name,s_sex,s_birth from student where s_id notin(SELECT t1.s_id from(SELECT s_id from score where c_id =01)as t1,(SELECT s_id from score where c_id =02)as t2,(SELECT s_id from score where c_id =03)as t3 where t1.s_id = t2.s_id and t2.s_id = t3.s_id)-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息 SELECT*from student where s_id in(SELECT s_id from score where c_id in(01,02,03)GROUPBY s_id)-- 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息 SELECT*from student where s_id in(SELECT s_id from score where c_id in(01,02,03)GROUPBY s_id HAVINGCOUNT(s_id)=3)-- 14、查询没学过"张三"老师讲授的任一门课程的学生姓名 SELECT s_name from student where s_id notin(SELECT s_id from score where c_id in(SELECT c_id from course where t_id in(SELECT t_id from teacher where t_name ='张三')))-- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 SELECT stu.s_id,stu.s_name, t1.avg from(SELECT s_id,avg(s_score)as avg from score where s_score <60GROUPBY s_id HAVINGCOUNT(s_id)>=2)as t1 , student as stu where t1.s_id = stu.s_id
-- 16、检索"01"课程分数小于60,按分数降序排列的学生信息SELECT*from student where s_id in(SELECT s_id FROM score where s_score <60and c_id =01ORDERBY s_score DESC)-- 17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩SELECT*from(SELECT s.s_id,stu.s_name,AVG(s.s_score)as avg from student as stu,score as s,course as c where s.c_id = c.c_id and stu.s_id= s.s_id GROUPBY s.s_id ORDERBY avg DESC)as t1 LEFTJOIN(SELECT s.s_id,s.s_score,c.c_name from course as c,score as s where s.c_id=c.c_id)as s on s.s_id = t1.s_id
-- 18.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90SELECT c_id,max(s_score)as 最高分,MIN(s_score)as 最低分,AVG(s_score)as 平均分,COUNT(*)as 选修人数,SUM(casewhen s_score >=60then1else0end)/count(*)as 及格率,SUM(casewhen s_score >=70and s_score<80then1else0end)/COUNT(*)as 中等率,SUM(casewhen80<= s_score and s_score <90then1else0end)/COUNT(*)as 优良率,SUM(casewhen s_score >=90then1else0end)/COUNT(*)as 优秀率 from score GROUPBY c_id
-- 19、按各科成绩进行排序,并显示排名-- 20、查询学生的总成绩并进行排名SELECT stu.s_name,sum(s.s_score)as sum1 from student as stu ,score as s where s.s_id = stu.s_id GROUPBY s.s_id ORDERBY sum1 DESC-- 21、查询不同老师所教不同课程平均分从高到低显示 SELECT s.c_id,n.name,avg(s.s_score)as avg from score as s ,(SELECT c.c_id,t.t_name as name from course as c,teacher as t where c.t_id = t.t_id)as n where n.c_id = s.c_id GROUPBY c_id ORDERBY avg DESC-- 22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩(SELECT s.s_id,c.c_id,s.s_score,stu.s_name,stu.s_birth,c.c_name from score as s,course as c,student as stu where s.c_id =01and s.s_id = stu.s_id and s.c_id = c.c_id ORDERBY s.s_score DESCLIMIT1,2)UNIONall(SELECT s.s_id,c.c_id,s.s_score,stu.s_name,stu.s_birth,c.c_name from score as s,course as c,student as stu where s.c_id =02and s.s_id = stu.s_id and s.c_id = c.c_id ORDERBY s.s_score DESCLIMIT1,2)unionall(SELECT s.s_id,c.c_id,s.s_score,stu.s_name,stu.s_birth,c.c_name from score as s,course as c,student as stu where s.c_id =03and s.s_id = stu.s_id and s.c_id = c.c_id ORDERBY s.s_score DESCLIMIT1,2)
-- 23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比SELECT s.c_id,c.c_name,sum(casewhen s.s_score >85and s.s_score <100then1else0end)/count(s.s_score)as'[100-85]所占百分比',sum(casewhen s.s_score <=85and s.s_score >70then1else0end)/count(s.s_score)as'[85-70]所占百分比',sum(casewhen s.s_score >60and s.s_score <=70then1else0end)/count(s.s_score)as'[70-60]所占百分比',sum(casewhen s.s_score >0and s.s_score <=60then1else0end)/count(s.s_score)as'[0-60]所占百分比'from score as s ,course as c where s.c_id = c.c_id and s.c_id =01UNIONallSELECT s.c_id,c.c_name,sum(casewhen s.s_score >85and s.s_score <100then1else0end)/count(s.s_score)as'[100-85]所占百分比',sum(casewhen s.s_score <=85and s.s_score >70then1else0end)/count(s.s_score)as'[85-70]所占百分比',sum(casewhen s.s_score >60and s.s_score <=70then1else0end)/count(s.s_score)as'[70-60]所占百分比',sum(casewhen s.s_score >0and s.s_score <=60then1else0end)/count(s.s_score)as'[0-60]所占百分比'from score as s ,course as c where s.c_id = c.c_id and s.c_id =02UNIONallSELECT s.c_id,c.c_name,sum(casewhen s.s_score >85and s.s_score <100then1else0end)/count(s.s_score)as'[100-85]所占百分比',sum(casewhen s.s_score <=85and s.s_score >70then1else0end)/count(s.s_score)as'[85-70]所占百分比',sum(casewhen s.s_score >60and s.s_score <=70then1else0end)/count(s.s_score)as'[70-60]所占百分比',sum(casewhen s.s_score >0and s.s_score <=60then1else0end)/count(s.s_score)as'[0-60]所占百分比'from score as s ,course as c where s.c_id = c.c_id and s.c_id =03
-- 24、查询学生平均成绩及其名次 SELECT stu.s_name,avg(s.s_score)as avg from student as stu,score as s where stu.s_id = s.s_id GROUPBY s.s_id ORDERBY avg DESC-- 25、查询各科成绩前三名的记录(SELECT c.c_name,stu.s_name,s.s_id,s.c_id,s.s_score from student as stu , score as s ,course as c where stu.s_id = s.s_id and s.c_id = c.c_id and s.c_id =01ORDERBY s.s_score DESCLIMIT3)UNIONall(SELECT c.c_name,stu.s_name,s.s_id,s.c_id,s.s_score from student as stu , score as s ,course as c where stu.s_id = s.s_id and s.c_id = c.c_id and s.c_id =02ORDERBY s.s_score DESCLIMIT3)UNIONall(SELECT c.c_name,stu.s_name,s.s_id,s.c_id,s.s_score from student as stu , score as s ,course as c where stu.s_id = s.s_id and s.c_id = c.c_id and s.c_id =03ORDERBY s.s_score DESCLIMIT3)-- 26、查询每门课程被选修的学生数 SELECT c.c_name,count(s.s_id)from course as c ,score as s where c.c_id = s.c_id GROUPBY c.c_id
-- 27、查询出只有两门课程的全部学生的学号和姓名 SELECT s.s_id,stu.s_name,count(s.c_id)as num from score as s ,student as stu where s.c_id in(01,02,03)and s.s_id = stu.s_id GROUPBY s.s_id HAVING num =2
-- 28、查询男生、女生人数 SELECT s_sex,count(s_sex)from student GROUPBY s_sex
-- 29、查询名字中含有"风"字的学生信息SELECT*from student where s_name like'%风%'
-- 30、查询同名同性学生名单,并统计同名人数 SELECT s_id, s_name,s_sex,count(*)from student where s_id != s_id and s_name = s_name and s_sex = s_sex GROUPBY s_id
-- 31、查询1990年出生的学生名单SELECT*from student where s_birth like"1990%"-- 32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 SELECT c_id,avg(s_score)as avg from score GROUPBY c_id ORDERBY avg DESC, c_id ASC-- 33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩 SELECT s.s_id,stu.s_name,avg(s.s_score)as avg from score as s ,student as stu where s.s_id = stu.s_id GROUPBY s.s_id HAVING avg >85
-- 34、查询课程名称为"数学",且分数低于60的学生姓名和分数 SELECT stu.s_name,s.s_score from course as c, student as stu ,score as s where c.c_id = s.c_id and s.s_id = stu.s_id and c.c_name ="数学"HAVING s.s_score <60-- 35、查询所有学生的课程及分数情况; SELECT stu.s_name,c.c_name,s.s_score from course as c, student as stu ,score as s where c.c_id = s.c_id and s.s_id = stu.s_id
-- 36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;SELECT stu.s_name,c.c_name,s.s_score from course as c, student as stu ,score as s where c.c_id = s.c_id and s.s_id = stu.s_id and s.s_score >70-- 37、查询不及格的课程
SELECT stu.s_name,c.c_name,s.s_score from course as c, student as stu ,score as s where c.c_id = s.c_id and s.s_id = stu.s_id and s.s_score <70
--38、查询课程编号为02且课程成绩在80分以上的学生的学号和姓名;SELECT s_id ,s_name from student where s_id in(SELECT s_id from score where s_score >80and c_id =02)-- 39、求每门课程的学生人数 SELECT c_id,count(s_id)as"学生人数"from score GROUPBY c_id
-- 40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩SELECT stu.*,t1.max from(SELECT s_id,max(s_score)as max from score where c_id in(SELECT c_id from course where t_id in(SELECT t_id from teacher where t_name ="张三")))as t1,student as stu where stu.s_id = t1.s_id
-- 41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 SELECT s_id,s_name,s_birth from student where s_id in(SELECT t1.s_id from(SELECT s_id,c_id,s_score from score where c_id =01)as t1,(SELECT s_id,c_id,s_score from score where c_id =02)as t2,(SELECT s_id,c_id,s_score from score where c_id =03)as t3 where t1.s_id = t2.s_id and t2.s_id = t3.s_id and t1.s_score=t2.s_score and t2.s_score=t3.s_score)
-- 42、查询每门功成绩最好的前两名 (SELECT*from score where c_id =01ORDERBY s_score DESCLIMIT1,2)UNIONall(SELECT*from score where c_id =02ORDERBY s_score DESCLIMIT1,2)UNIONALL(SELECT*from score where c_id =03ORDERBY s_score DESCLIMIT1,2)-- 43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 SELECT c_id,COUNT(c_id)as num from score GROUPBY c_id ORDERBY num DESC,c_id ASC
-- 44、检索至少选修两门课程的学生学号 SELECT s_id,COUNT(c_id)as cnum from score GROUPBY s_id HAVING cnum >=2-- 45、查询选修了全部课程的学生信息 SELECT s_id,COUNT(c_id)as cnum from score where c_id in(01,02,03)GROUPBY s_id HAVING cnum =3--46、查询各学生的年龄SELECT s_id,year(NOW())-year(s_birth)from student
-- 47、查询本周过生日的学生
select*from student
where YEARWEEK(s_birth)=YEARWEEK(now())