- 建表
- ">

- 题目:
- 1、查询”01”课程比”02”课程成绩高的学生的信息及课程分数
- 2、查询”01”课程比”02”课程成绩低的学生的信息及课程分数
- 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
- avg保留几位小数
- 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
- 5.查询所有同学的学生编号,学生姓名,选课总数,所有课程的总成绩
- 6.查询‘李’姓老师的数量
- 7.查询学过’张三‘老师授课的同学的信息
- 8.查询没学过”张三”老师授课的同学的信息
- ">

- 9.查询学过01也学过02的课程的同学的信息
- 10.查询学过01但是没有学过02的同学的信息
- 11.查询没有学全所有课程的同学的信息
- 12.查询至少有一门课与学号为’01‘的同学所学相同的同学的信息
- *13.查询和01号的同学学习的课程完全相同的其他同学的信息
- 14.查询没学过‘张三’老师教的任一门课程的学生姓名
- 15.查询两门及以上不及格课程的同学的学号姓名及平均成绩
- 16.检索01分数小于60,按分数降序排列的学生信息
- 17.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
- *18.查询各科成绩最高分、最低分和平均分
- 19.按各科成绩进行排序,并显示排名
- 20.查询学生的总成绩并进行排名
- 21.查询不同老师所教不同课程平均分从高到低显示
建表
CREATE TABLE `Student`(`s_id` VARCHAR(20),`s_name` VARCHAR(20) NOT NULL DEFAULT '',`s_birth` VARCHAR(20) NOT NULL DEFAULT '',`s_sex` VARCHAR(10) NOT NULL DEFAULT '',PRIMARY KEY(`s_id`));CREATE TABLE `Course`(`c_id` VARCHAR(20),`c_name` VARCHAR(20) NOT NULL DEFAULT '',`t_id` VARCHAR(20) NOT NULL,PRIMARY KEY(`c_id`));CREATE TABLE `Teacher`(`t_id` VARCHAR(20),`t_name` VARCHAR(20) NOT NULL DEFAULT '',PRIMARY KEY(`t_id`));CREATE TABLE `Score`(`s_id` VARCHAR(20),`c_id` VARCHAR(20),`s_score` INT(3),PRIMARY KEY(`s_id`,`c_id`));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' , '女');insert into Course values('01' , '语文' , '02');insert into Course values('02' , '数学' , '01');insert into Course values('03' , '英语' , '03');insert into Teacher values('01' , '张三');insert into Teacher values('02' , '李四');insert into Teacher values('03' , '王五');insert into Score values('01' , '01' , 80);insert into Score values('01' , '02' , 90);insert into Score values('01' , '03' , 99);insert into Score values('02' , '01' , 70);insert into Score values('02' , '02' , 60);insert into Score values('02' , '03' , 80);insert into Score values('03' , '01' , 80);insert into Score values('03' , '02' , 80);insert into Score values('03' , '03' , 80);insert into Score values('04' , '01' , 50);insert into Score values('04' , '02' , 30);insert into Score values('04' , '03' , 20);insert into Score values('05' , '01' , 76);insert into Score values('05' , '02' , 87);insert into Score values('06' , '01' , 31);insert into Score values('06' , '03' , 34);insert into Score values('07' , '02' , 89);insert into Score values('07' , '03' , 98);
student
Course
Teacher
Score
题目:
1、查询”01”课程比”02”课程成绩高的学生的信息及课程分数
select s.*,sc1.s_score AS '01',sc2.s_score AS '02'from Student as sjoin Score as sc1on s.s_id=sc1.s_id and sc1.c_id=01join Score as sc2on s.s_id=sc2.s_id and sc2.c_id=02join Course as con c.c_id=sc1.c_idwhere sc1.s_score>sc2.s_score
2、查询”01”课程比”02”课程成绩低的学生的信息及课程分数
select s.*,sc1.s_score as '01',sc2.s_score as '02'from Student as sjoin Score as sc1on s.s_id=sc1.s_id and sc1.c_id=01join Score as sc2on s.s_id=sc2.s_id and sc2.c_id=02where sc1.s_score<sc2.s_score
3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
select s.s_id,s.s_name,avg(sc.s_score) as avgfrom Student as sjoin Score as scon s.s_id=sc.s_idgroup by sc.s_id having avg(sc.s_score)>=60
avg保留几位小数
4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
-- (包括有成绩的和无成绩的)
select s.s_id,s.s_name,round(avg(sc.s_score),2) as avgfrom Student as sjoin Score as scon s.s_id=sc.s_idgroup by sc.s_id having avg(sc.s_score)<60

有问题!
08没成绩
select s.s_id,s.s_name,round(avg(sc.s_score),2) as avgfrom Student as sright join Score as scon s.s_id=sc.s_idgroup by s.s_id having avg(sc.s_score)<60UNIONSELECT s.s_id,s.s_name,0 as avgfrom Student as swhere s.s_id not in (select s_id from Score)
5.查询所有同学的学生编号,学生姓名,选课总数,所有课程的总成绩
select s.s_id,s.s_name,count(sc.c_id) as count,sum(sc.s_score) as sumfrom Student as sleft join Score as scon s.s_id=sc.s_idgroup by s.s_id
6.查询‘李’姓老师的数量
select count(t.t_id)from Teacher twhere t_name like '李%'
7.查询学过’张三‘老师授课的同学的信息
select s.*from Student as sleft join Score as scon s.s_id=sc.s_idleft join Course as con sc.c_id=c.c_idleft join Teacher as ton c.t_id=t.t_idwhere t.t_name ='张三'
8.查询没学过”张三”老师授课的同学的信息
select s.*from Student as swhere s.s_id not in(SELECT s.s_idfrom Student as sleft join Score as scon s.s_id=sc.s_idleft join Course as con sc.c_id=c.c_idleft join Teacher as ton c.t_id=t.t_idwhere t.t_name = '张三')
9.查询学过01也学过02的课程的同学的信息
select s.*from Student as sjoin Score as sc1on s.s_id=sc1.s_id and sc1.c_id=01join Score as sc2on s.s_id=sc2.s_id and sc2.c_id=02
10.查询学过01但是没有学过02的同学的信息
select s.*from Student as sjoin Score as sc1on s.s_id=sc1.s_id and sc1.c_id=01where s.s_id not in (select s_id from Score where c_id=02)
11.查询没有学全所有课程的同学的信息
select s.* from Student swhere s.s_id not in(select s.s_idfrom Student as sjoin Score as sc1on s.s_id=sc1.s_id and sc1.c_id=01join Score as sc2on s.s_id=sc2.s_id and sc2.c_id=02join Score as sc3on s.s_id=sc3.s_id and sc3.c_id=03)
12.查询至少有一门课与学号为’01‘的同学所学相同的同学的信息
select distinct s.*from Student sjoin Score scon s.s_id=sc.s_idwhere sc.c_id in (select c_id from Score where s_id=01)AND s.s_id <>01
*13.查询和01号的同学学习的课程完全相同的其他同学的信息
完全相同
SELECT s.* FROM Student as sWHERE s.s_id IN(SELECT sc1.s_id FROM Score sc1LEFT JOIN (SELECT DISTINCT c_id FROM Score WHERE s_id=01) sc2 ON sc1.c_id=sc2.c_idWHERE sc1.s_id<>01GROUP BY sc1.s_idHAVING COUNT(sc1.c_id)=(SELECT DISTINCT COUNT(c_id) FROM Score WHERE s_id=01) AND COUNT(sc2.c_id)=COUNT(sc1.c_id) -- 自身课程数=01课程数,且,自身课程=01课程);
14.查询没学过‘张三’老师教的任一门课程的学生姓名
select distinct s.s_namefrom Student swhere s.s_name not in(select distinct s.s_namefrom Student sjoin Score scon s.s_id=sc.s_idjoin Course con sc.c_id=c.c_idjoin Teacher ton c.t_id=t.t_idwhere t.t_name ='张三')
15.查询两门及以上不及格课程的同学的学号姓名及平均成绩
select s.s_name,avg(sc.s_score) as avgfrom Student as sjoin Score as scon s.s_id=sc.s_idwhere s.s_id in(select s_id from Score scwhere s_score<60group by sc.s_idHAVING count(*)>=2)group by sc.s_id
16.检索01分数小于60,按分数降序排列的学生信息
select s.*from Student as sjoin Score as scon s.s_id=sc.s_idwhere sc.c_id=01and sc.s_score<60order by sc.s_score desc
17.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select sc.*,avgfrom Score scjoin (select s_id,avg(s_score) as avg from Score group by s_id) sc2on sc.s_id=sc2.s_idorder by avg desc
*18.查询各科成绩最高分、最低分和平均分
以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
—及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
SELECT sc.c_id,c.c_name,max(sc.s_score),min(sc.s_score),avg(sc.s_score) as avg,SUM(CASE WHEN sc.s_score <=60 THEN 1 ELSE 0 END)/ COUNT( sc.s_id) as '及格率',SUM(CASE WHEN sc.s_score BETWEEN 70 AND 80 THEN 1 ELSE 0 END)/ COUNT(s_id) as'中等率',SUM(CASE WHEN sc.s_score BETWEEN 80 AND 90 THEN 1 ELSE 0 END)/ COUNT( s_id) as'优良率',SUM(CASE WHEN sc.s_score >=90 THEN 1 ELSE 0 END)/ COUNT( sc.s_id)/ COUNT(s_id) as'优秀率'FROM Score scJOIN Course con sc.c_id=c.c_idgroup by sc.c_id
19.按各科成绩进行排序,并显示排名
set @rank:=0;set @prerank:=null;set @intrank:=1;select s_id,s_score,c_id,rankfrom(SELECT s_id,s_score,c_id,@rank:=if(@prerank=s_score,@rank,@intrank)as rank,@intrank:=@intrank+1,@prerank:=s_scorefrom Scoreorder by c_id,s_score desc) r
20.查询学生的总成绩并进行排名
set @rank:=0;set @prerank:=null;set @intrank:=1;select s_id,s_score,sum,rankfrom(SELECT s_id,s_score,sum(s_score) as 'sum',@rank:=if(@prerank=sum(s_score),@rank,@intrank)as rank,@intrank:=@intrank+1,@prerank:=sum(s_score)from Scoregroup by s_idorder by sum(s_score) desc) r
21.查询不同老师所教不同课程平均分从高到低显示
SELECT t_name,t.t_id,avg(s_score) as avgfrom Teacher tjoin Course con t.t_id=c.t_idjoin Score son c.c_id=s.c_idgroup by s.c_idorder by avg(s_score) desc


