-- 建表语句-- 建表-- 学生表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);/*-------------------------------------------------------------------*/-- 测试题-- 查询"01"课程比"02"课程成绩高的学生的信息及课程分数select stu.*,s1.s_score s1,s2.s_score s2 from
student stu
innerjoin
score s1 on stu.s_id = s1.s_id and s1.c_id='01'innerjoin
score s2 on stu.s_id = s2.s_id and s2.c_id='02'where s1.s_score>s2.s_score
-- 查询"01"课程比"02"课程成绩低的学生的信息及课程分数select stu.*,s1.s_score s1,s2.s_score s2 from
student stu
innerjoin
score s1 on stu.s_id = s1.s_id and s1.c_id='01'innerjoin
score s2 on stu.s_id = s2.s_id and s2.c_id='02'where s1.s_score<s2.s_score
-- 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩select stu.s_id,stu.s_name,sc.avsc from
student stu
innerjoin(select s_id,round(avg(s_score),2) avsc from score groupby s_id having avsc>=60) sc
on stu.s_id=sc.s_id;-- 查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩-- (包括有成绩的和无成绩的) select stu.s_id,stu.s_name,ifnull(sc.avsc,0) avsc from
student stu
leftjoin(select s_id,round(avg(s_score),2) avsc from score groupby s_id) sc
on stu.s_id=sc.s_id
having avsc<60orderby sc.avsc desc;-- 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩select stu.*,ifnull(sc.cous,0) cous,ifnull(sc.sums,0) sums from
student stu
leftjoin(select s_id,count(c_id) cous,sum(s_score) sums from score groupby s_id) sc
on stu.s_id=sc.s_id;-- 查询"李"姓老师的数量 selectcount(1)from teacher where t_name like'%李%';-- 查询学过"张三"老师授课的同学的信息 select*from student where s_id in(select s_id from score where c_id in(select c_id from course where t_id =(select t_id from teacher where t_name='张三')));-- 查询没学过"张三"老师授课的同学的信息 select*from student where s_id notin(select s_id from score where c_id in(select c_id from course where t_id =(select t_id from teacher where t_name='张三')));-- 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息 select*from student where s_id in(select s_id from score where c_id='01')and s_id in(select s_id from score where c_id='02');-- 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息select*from student where s_id in(select s_id from score where c_id='01')and s_id notin(select s_id from score where c_id='02');-- 查询没有学全所有课程的同学的信息 select*from student where s_id notin(select s_id from score where c_id in('01','02','03')groupby s_id havingcount(c_id)=3);-- 查询至少有一门课与学号为"01"的同学所学相同的同学的信息select*from student where s_id in(select s_id from score where s_id!='01'and c_id in(select c_id from score where s_id='01')groupby s_id);-- 查询和"01"号的同学学习的课程完全相同的其他同学的信息select*from student where s_id in(select s_id from score where s_id!='01'and c_id in(select c_id from score where s_id='01')groupby s_id
havingcount(c_id)=(selectcount(c_id)from score where s_id='01'));-- 查询没学过"张三"老师讲授的任一门课程的学生姓名 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 =(select t_id from teacher where t_name='张三')));-- 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 select stu.s_id,stu.s_name,sc.avsc from
student stu
innerjoin(select s_id,round(avg(s_score),2) avsc from score where s_score<60groupby s_id) sc
on stu.s_id=sc.s_id;-- 检索"01"课程分数小于60,按分数降序排列的学生信息select stu.*,s1.c_id,s1.s_score from
student stu
innerjoin(select s_id,c_id,s_score from score where c_id='01'and s_score<60) s1
on stu.s_id=s1.s_id;orderby s1.s_score desc;-- 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩select s1.s_id,(select s_score from score where s1.s_id=s_id and c_id='01') 语文,(select s_score from score where s1.s_id=s_id and c_id='02') 数学,(select s_score from score where s1.s_id=s_id and c_id='03') 英语,round(avg(s_score),2) 平均分 from score s1 groupby s_id orderbyavg(s_score)desc;-- 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率-- 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90select a.c_id,b.c_name,MAX(s_score) 最高分,MIN(s_score) 最低分,ROUND(AVG(s_score),2) 平均分,ROUND(100*(SUM(casewhen a.s_score>=60then1else0end)/SUM(casewhen a.s_score then1else0end)),2)as 及格率,ROUND(100*(SUM(casewhen a.s_score>=70and a.s_score<=80then1else0end)/SUM(casewhen a.s_score then1else0end)),2)as 中等率,ROUND(100*(SUM(casewhen a.s_score>=80and a.s_score<=90then1else0end)/SUM(casewhen a.s_score then1else0end)),2)as 优良率,ROUND(100*(SUM(casewhen a.s_score>=90then1else0end)/SUM(casewhen a.s_score then1else0end)),2)as 优秀率
from score a rightjoin course b on a.c_id = b.c_id GROUPBY a.c_id,b.c_name
-- 19、按各科成绩进行排序,并显示排名(实现不完全)-- mysql没有rank函数select stu.*,s1.sc 语文分数,s2.sc 数学分数,s3.sc 英语分数,s1.i 语文排名,s2.j 数学排名,s3.z 英语排名 from
student stu
leftjoin(select s_id id,s_score sc,@i:=@i+1 i from score,(select@i:=0)a where c_id='01'orderby s_score desc) s1
on stu.s_id=s1.id
leftjoin(select s_id id,s_score sc,@j:=@j+1 j from score,(select@j:=0)a where c_id='02'orderby s_score desc) s2
on stu.s_id=s2.id
leftjoin(select s_id id,s_score sc,@z:=@z+1 z from score,(select@z:=0)a where c_id='03'orderby s_score desc) s3
on stu.s_id=s3.id
orderby stu.s_id;-- 查询学生的总成绩并进行排名select s_id id,sum(s_score),@i:=@i+1 ran from score,(select@i:=0)a groupby s_id orderbysum(s_score)desc;-- 查询不同老师所教不同课程平均分从高到低显示select t.t_name,c.c_id,c_name,avg(s_score)from
teacher t
innerjoin
course c
on t.t_id=c.t_id
innerjoin
score sc
on c.c_id=sc.c_id
groupby c_id
orderbyavg(s_score)desc;-- 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩select stu.*,s1.cid,s1.sc,s1.ran from
student stu
innerjoin(select s_id id,c_id cid,s_score sc,@i:=@i+1 ran from score,(select@i:=0)s where c_id='01'orderby s_score desc) s1
on stu.s_id=s1.id
where s1.ran=2or s1.ran=3unionselect stu.*,s1.cid,s1.sc,s1.ran from
student stu
innerjoin(select s_id id,c_id cid,s_score sc,@j:=@j+1 ran from score,(select@j:=0)s where c_id='02'orderby s_score desc) s1
on stu.s_id=s1.id
where s1.ran=2or s1.ran=3unionselect stu.*,s1.cid,s1.sc,s1.ran from
student stu
innerjoin(select s_id id,c_id cid,s_score sc,@z:=@z+1 ran from score,(select@z:=0)s where c_id='03'orderby s_score desc) s1
on stu.s_id=s1.id
where s1.ran=2or s1.ran=3;-- 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比selectdistinct f.c_name,a.c_id,b.`85-100`,b.百分比,c.`70-85`,c.百分比,d.`60-70`,d.百分比,e.`0-60`,e.百分比 from score a
leftjoin(select c_id,SUM(casewhen s_score >85and s_score <=100then1else0end)as`85-100`,ROUND(100*(SUM(casewhen s_score >85and s_score <=100then1else0end)/count(*)),2)as 百分比
from score GROUPBY c_id)b on a.c_id=b.c_id
leftjoin(select c_id,SUM(casewhen s_score >70and s_score <=85then1else0end)as`70-85`,ROUND(100*(SUM(casewhen s_score >70and s_score <=85then1else0end)/count(*)),2)as 百分比
from score GROUPBY c_id)c on a.c_id=c.c_id
leftjoin(select c_id,SUM(casewhen s_score >60and s_score <=70then1else0end)as`60-70`,ROUND(100*(SUM(casewhen s_score >60and s_score <=70then1else0end)/count(*)),2)as 百分比
from score GROUPBY c_id)d on a.c_id=d.c_id
leftjoin(select c_id,SUM(casewhen s_score >=0and s_score <=60then1else0end)as`0-60`,ROUND(100*(SUM(casewhen s_score >=0and s_score <=60then1else0end)/count(*)),2)as 百分比
from score GROUPBY c_id)e on a.c_id=e.c_id
leftjoin course f on a.c_id = f.c_id
-- 查询学生平均成绩及其名次select s.*,@i:=@i+1 ran from(select s_id,round(avg(s_score),2) avsc from score groupby s_id orderbyavg(s_score)desc) s,(select@i:=0) a;-- 查询各科成绩前三名的记录-- 1.选出b表比a表成绩大的所有组-- 2.选出比当前id成绩大的 小于三个的select a.s_id,a.c_id,a.s_score from score a
leftjoin score b on a.c_id = b.c_id and a.s_score<b.s_score
groupby a.s_id,a.c_id HAVINGCOUNT(b.s_id)<3ORDERBY a.c_id,a.s_score DESC-- 查询每门课程被选修的学生数 select c_id,count(s_id)from score groupby c_id;-- 查询出只有两门课程的全部学生的学号和姓名 select s_id,s_name from
student stu
where s_id in(select s_id from score groupby s_id havingcount(c_id)=2);-- 查询男生、女生人数 select s_sex,COUNT(s_sex)as 人数 from student GROUPBY s_sex
-- 查询名字中含有"风"字的学生信息select*from student where s_name like'%风%';-- 查询同名同性学生名单,并统计同名人数 select s_name,s_sex,count(s_name)from student groupby s_name,s_sex havingcount(s_name)>1;-- 查询1990年出生的学生名单 select s_name from student where s_birth like'1990%'-- 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 select c_id,avg(s_score)from score groupby c_id orderbyavg(s_score)desc,c_id asc;-- 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩 select stu.s_id,stu.s_name,sc.avsc from
student stu
innerjoin(select s_id,avg(s_score) avsc from score groupby s_id havingavg(s_score)>=85) sc
on stu.s_id=sc.s_id;-- 查询课程名称为"数学",且分数低于60的学生姓名和分数 select stu.s_id,stu.s_name,sc.score from
student stu
innerjoin(select s_id,s_score score from score where c_id=(select c_id from course where c_name="数学")and s_score<60) sc
on stu.s_id=sc.s_id;-- 查询所有学生的课程及分数情况select stu.*,max(casewhen sc.c_id='01'then sc.s_score end) 语文,max(casewhen sc.c_id='02'then sc.s_score end) 数学,max(casewhen sc.c_id='03'then sc.s_score end) 英语
from student stu innerjoin score sc on stu.s_id=sc.s_id
groupby stu.s_id;-- 查询任何一门课程成绩在70分以上的姓名、课程名称和分数select stu.s_name,c.c_name,sc.s_score from
student stu innerjoin score sc on stu.s_id=sc.s_id
innerjoin course c on sc.c_id=c.c_id;where sc.s_score >70;-- 查询不及格的课程select sc.s_id,sc.c_id,c.c_name,sc.s_score
from score sc innerjoin course c
on sc.c_id = c.c_id
where sc.s_score<60;-- 查询课程编号为01且课程成绩在80分以上的学生的学号和姓名select stu.s_id,stu.s_name where s_id in(select s_id from score where c_id='01'and s_score>80);-- 求每门课程的学生人数select c_name,count(s_id)from score sc innerjoin course c on sc.c_id=c.c_id groupby c.c_name;-- 查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩select stu.*,sc.s_score
from student stu
innerjoin(select s_id,s_score from score where c_id in(select c_id from course where t_id in(select t_id from teacher where t_name='张三'))orderby s_score desclimit0,1) sc
on stu.s_id=sc.s_id
-- 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 selectDISTINCT b.s_id,b.c_id,b.s_score from score a,score b where a.c_id != b.c_id and a.s_score = b.s_score;-- 查询每门功成绩最好的前两名 -- 牛逼的写法-- 遍历score a score b,在相同的c_id的情况下,b中能找到的大于a的记录小于等于2条时,代表a中该记录是该课程的前2名select a.s_id,a.c_id,a.s_score from score a
where(selectCOUNT(1)from score b where b.c_id=a.c_id and b.s_score>=a.s_score)<=2ORDERBY a.c_id
-- 统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 select c_id,count(s_id)from score groupby c_id havingcount(s_id)>5orderbycount(s_id)desc,c_id asc;-- 检索至少选修两门课程的学生学号select s_id from score groupby s_id havingcount(c_id)>=2;-- 查询选修了全部课程的学生信息select stu.*from student stu where stu.s_id in(select s_id from score groupby s_id havingcount(c_id)=(selectcount(c_id)from course));-- 查询各学生的年龄-- 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一select s_birth,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_birth,'%Y')-(casewhen DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_birth,'%m%d')then0else1end))as age
from student;-- 查询本周过生日的学生select*from student where YEARWEEK(s_birth)=YEARWEEK(DATE_FORMAT(NOW(),'%Y%m%d'));-- 查询下周过生日的学生select*from student where WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1=WEEK(s_birth);-- 查询本月过生日的学生select*from student whereMONTH(DATE_FORMAT(NOW(),'%Y%m%d'))=MONTH(s_birth);-- 查询下月过生日的学生select*from student whereMONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1=MONTH(s_birth);