之前发现自己写sql不怎么得心应手,总是百度零零散散的学习一下,所以在空闲的时候自己就专门找一下mysql的强化题敲一下练习一下,简要记录一下,sql写着写着就会越来越熟练,总之要自己加油!
表结构
学生表:Student(SNO,Sname,Sage,Sex)
课程表:Course(CNO,Cname,TNO)
成绩表:SC(SNO,CNO,score)
教师表:Teacher(TNO,Tname)
建表语句
create table student( id int primary key auto_increment comment '主键id', sno int not null comment '学号', sname varchar(100) comment '姓名', age int comment '年龄', sex int not null comment '性别0男1女' )comment= '学生表' create table course( id int primary key auto_increment comment '课程表主键id', cno int not null comment '课程号', cname varchar(100) comment '课程名', tno int not null comment '教师编号' )comment = '课程表' create table sc( id int primary key auto_increment comment '成绩表主键id', sno int not null comment '学号', cno int not null comment '课程号', score int not null comment '分数' )comment = '成绩表' create table teacher( id int primary key auto_increment comment '教师表主键id', tno int not null comment '教师编号', tname varchar(100) comment '教师姓名' )comment = '教师表'
#1.查询“3001”课程比“3002”课程成绩高的所有学生的学号 select a.sno from (select sno,score from sc where cno=3001)a, (select sno,score from sc where cno=3002)b where a.score>b.score and a.sno=b.sno #2.查询平均成绩大于60分的同学的学号和平均成绩 select sno, AVG(score) avg_score from sc group by sno having avg_score>60 #3.查询所有同学的学号、姓名、选课数、总成绩 select student.sno, student.sname, count(sc.cno), sum(sc.score) from student left join sc on student.sno = sc.sno group by student.sno #4.查询姓“李”的教师数 select count(distinct(teacher.tname)) num from teacher where teacher.tname like '李%' #5.查询没有学过“李老师”课程的同学的学号、姓名 select student.sno, student.sname from student where student.sno not in ( select sc.sno from sc inner join course on sc.cno = course.cno inner join teacher on teacher.tno = course.tno where teacher.tname = '李老师' ) #6.查询学过“王老师”所有课程的学生的学号、姓名 select student.sno,student.sname from student where student.sno in ( select sc.sno from sc inner join course on sc.cno = course.cno inner join teacher on course.tno = teacher.tno where teacher.tname = '王老师' group by sc.sno having count(sc.sno)=( select COUNT(course.cno) from teacher inner join course on teacher.tno = course.tno where teacher.tname = '王老师' ) ) #7.查询学过“3001”也学过“3004”课程的学生的学号、姓名 select student.sno,student.sname from student inner join sc on student.sno = sc.sno where cno = 3001 and student.sno in ( select sc.sno from sc where sc.cno=3004 ) select student.sno,student.sname from student inner join sc a on student.sno = a.sno where cno = 3001 and EXISTS ( select b.sno from sc b where a.sno = b.sno and b.cno=3004 ) #8.查询所有课程成绩小于60的同学的学号、姓名 select stu.sno,stu.sname from student stu where stu.sno not in( select sc.sno from sc where sc.score >= 60 group by sc.sno ) #9.查询没有学全所有课的同学的学号、姓名 select student.sno,student.sname from student inner join sc on student.sno = sc.sno group by sc.sno having count(*)< ( select count(cno) from course ) #10.查询至少有一门课与学号为“1001”同学所学相同的学生的学号和姓名 select student.sno,student.sname from student inner join sc on student.sno = sc.sno where sc.sno != 1001 and sc.cno in( select sc.cno from sc where sc.sno = 1001 ) group by student.sno #11.查询和“1001”号的同学学习的课程完全相同的其他同学学号和姓名 select sc.sno from sc where sc.sno != 1002 and cno in (select cno from sc where sc.sno = 1002) group by sno having count(*) = (select count(*) from sc where sno = 1002) #12.删除学习“李老师”课的sc表记录 delete sc from sc inner join course on course.cno = sc.cno inner join teacher on teacher.tno = course.tno where teacher.tname = '李老师' #13.向sc表中插入一些记录,这些记录要求符合以下条件;没有上过编号“3004”课程的同学学号、3001号课程的平均成绩 insert into sc(sno,cno,score) select sno,3001,(SELECT AVG(score) from sc where cno = 3001) from student where sno not in ( select sno from sc where cno = 3003 ) #14.按平均成绩从高到低显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示:学生id,语文,数学,英语,有效课程数,有效平均分 select s.sno as '学生id', (select s1.score from sc s1 where s1.sno = s.sno and s1.cno = 3001) as '语文', (select s2.score from sc s2 where s2.sno = s.sno and s2.cno = 3002) as '数学', (select s3.score from sc s3 where s3.sno = s.sno and s3.cno = 3003) as '英语', count(cno) as '有效课程数', AVG(score) as '有效平均分' from sc s group by s.sno order by '有效平均分' #15.查询各科成绩最高和最低的分:以如下的形式显示,课程id,最高分,最低分 select s.cno as '课程id', (select max(score) from sc s1 where s1.cno = s.cno) as '最高分', (select min(score) from sc s2 where s2.cno = s.cno) as '最低分' from sc s group by s.cno #16.按各科平均成绩从低到高和及格率的百分数从高到低顺序 select s.cno as '课程id', course.cname as '课程名', AVG(s.score) as avgScore, (select count(*) from sc s1 where s.cno = s1.cno and s1.score>60)/count(sno)*100 as rate from sc s inner join course on course.cno = s.cno group by s.cno order by avgScore asc,rate desc #17.查询“3001”课程成绩在第2名到3名的学生的各科成绩 select student.sname,course.cname,sc.score from course inner join sc on course.cno = sc.cno and course.cno = 3001 inner join student on student.sno = sc.sno order by sc.score desc limit 1,2 #18.查询出只选修两门课程的全部学生的学号和姓名 select student.sno,student.sname from student inner join sc on student.sno = sc.sno group by student.sno having count(student.sno)=2