建表

  1. CREATE TABLE `Student`(
  2. `s_id` VARCHAR(20),
  3. `s_name` VARCHAR(20) NOT NULL DEFAULT '',
  4. `s_birth` VARCHAR(20) NOT NULL DEFAULT '',
  5. `s_sex` VARCHAR(10) NOT NULL DEFAULT '',
  6. PRIMARY KEY(`s_id`)
  7. );
  8. CREATE TABLE `Course`(
  9. `c_id` VARCHAR(20),
  10. `c_name` VARCHAR(20) NOT NULL DEFAULT '',
  11. `t_id` VARCHAR(20) NOT NULL,
  12. PRIMARY KEY(`c_id`)
  13. );
  14. CREATE TABLE `Teacher`(
  15. `t_id` VARCHAR(20),
  16. `t_name` VARCHAR(20) NOT NULL DEFAULT '',
  17. PRIMARY KEY(`t_id`)
  18. );
  19. CREATE TABLE `Score`(
  20. `s_id` VARCHAR(20),
  21. `c_id` VARCHAR(20),
  22. `s_score` INT(3),
  23. PRIMARY KEY(`s_id`,`c_id`)
  24. );
  25. insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
  26. insert into Student values('02' , '钱电' , '1990-12-21' , '男');
  27. insert into Student values('03' , '孙风' , '1990-05-20' , '男');
  28. insert into Student values('04' , '李云' , '1990-08-06' , '男');
  29. insert into Student values('05' , '周梅' , '1991-12-01' , '女');
  30. insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
  31. insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
  32. insert into Student values('08' , '王菊' , '1990-01-20' , '女');
  33. insert into Course values('01' , '语文' , '02');
  34. insert into Course values('02' , '数学' , '01');
  35. insert into Course values('03' , '英语' , '03');
  36. insert into Teacher values('01' , '张三');
  37. insert into Teacher values('02' , '李四');
  38. insert into Teacher values('03' , '王五');
  39. insert into Score values('01' , '01' , 80);
  40. insert into Score values('01' , '02' , 90);
  41. insert into Score values('01' , '03' , 99);
  42. insert into Score values('02' , '01' , 70);
  43. insert into Score values('02' , '02' , 60);
  44. insert into Score values('02' , '03' , 80);
  45. insert into Score values('03' , '01' , 80);
  46. insert into Score values('03' , '02' , 80);
  47. insert into Score values('03' , '03' , 80);
  48. insert into Score values('04' , '01' , 50);
  49. insert into Score values('04' , '02' , 30);
  50. insert into Score values('04' , '03' , 20);
  51. insert into Score values('05' , '01' , 76);
  52. insert into Score values('05' , '02' , 87);
  53. insert into Score values('06' , '01' , 31);
  54. insert into Score values('06' , '03' , 34);
  55. insert into Score values('07' , '02' , 89);
  56. insert into Score values('07' , '03' , 98);

student

图片.png

Course

图片.png

Teacher

图片.png

Score

图片.png

题目:

1、查询”01”课程比”02”课程成绩高的学生的信息及课程分数

  1. select s.*,sc1.s_score AS '01',sc2.s_score AS '02'
  2. from Student as s
  3. join Score as sc1
  4. on s.s_id=sc1.s_id and sc1.c_id=01
  5. join Score as sc2
  6. on s.s_id=sc2.s_id and sc2.c_id=02
  7. join Course as c
  8. on c.c_id=sc1.c_id
  9. where sc1.s_score>sc2.s_score

图片.png

2、查询”01”课程比”02”课程成绩低的学生的信息及课程分数

  1. select s.*,sc1.s_score as '01',sc2.s_score as '02'
  2. from Student as s
  3. join Score as sc1
  4. on s.s_id=sc1.s_id and sc1.c_id=01
  5. join Score as sc2
  6. on s.s_id=sc2.s_id and sc2.c_id=02
  7. where sc1.s_score<sc2.s_score

图片.png

3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

  1. select s.s_id,s.s_name,avg(sc.s_score) as avg
  2. from Student as s
  3. join Score as sc
  4. on s.s_id=sc.s_id
  5. group by sc.s_id having avg(sc.s_score)>=60

图片.png
tips:

avg保留几位小数

round(avg(___),2)

4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

  1. -- (包括有成绩的和无成绩的)
  1. select s.s_id,s.s_name,round(avg(sc.s_score),2) as avg
  2. from Student as s
  3. join Score as sc
  4. on s.s_id=sc.s_id
  5. group by sc.s_id having avg(sc.s_score)<60

图片.png
有问题!
08没成绩

  1. select s.s_id,s.s_name,round(avg(sc.s_score),2) as avg
  2. from Student as s
  3. right join Score as sc
  4. on s.s_id=sc.s_id
  5. group by s.s_id having avg(sc.s_score)<60
  6. UNION
  7. SELECT s.s_id,s.s_name,0 as avg
  8. from Student as s
  9. where s.s_id not in (select s_id from Score)

5.查询所有同学的学生编号,学生姓名,选课总数,所有课程的总成绩

  1. select s.s_id,s.s_name,count(sc.c_id) as count,sum(sc.s_score) as sum
  2. from Student as s
  3. left join Score as sc
  4. on s.s_id=sc.s_id
  5. group by s.s_id

图片.png

6.查询‘李’姓老师的数量

  1. select count(t.t_id)
  2. from Teacher t
  3. where t_name like '李%'

image.png

7.查询学过’张三‘老师授课的同学的信息

  1. select s.*
  2. from Student as s
  3. left join Score as sc
  4. on s.s_id=sc.s_id
  5. left join Course as c
  6. on sc.c_id=c.c_id
  7. left join Teacher as t
  8. on c.t_id=t.t_id
  9. where t.t_name ='张三'

image.png

8.查询没学过”张三”老师授课的同学的信息

  1. select s.*
  2. from Student as s
  3. where s.s_id not in
  4. (
  5. SELECT s.s_id
  6. from Student as s
  7. left join Score as sc
  8. on s.s_id=sc.s_id
  9. left join Course as c
  10. on sc.c_id=c.c_id
  11. left join Teacher as t
  12. on c.t_id=t.t_id
  13. where t.t_name = '张三'
  14. )

image.png

9.查询学过01也学过02的课程的同学的信息

  1. select s.*
  2. from Student as s
  3. join Score as sc1
  4. on s.s_id=sc1.s_id and sc1.c_id=01
  5. join Score as sc2
  6. on s.s_id=sc2.s_id and sc2.c_id=02

image.png

10.查询学过01但是没有学过02的同学的信息

  1. select s.*
  2. from Student as s
  3. join Score as sc1
  4. on s.s_id=sc1.s_id and sc1.c_id=01
  5. where s.s_id not in (select s_id from Score where c_id=02)

image.png

11.查询没有学全所有课程的同学的信息

  1. select s.* from Student s
  2. where s.s_id not in
  3. (
  4. select s.s_id
  5. from Student as s
  6. join Score as sc1
  7. on s.s_id=sc1.s_id and sc1.c_id=01
  8. join Score as sc2
  9. on s.s_id=sc2.s_id and sc2.c_id=02
  10. join Score as sc3
  11. on s.s_id=sc3.s_id and sc3.c_id=03
  12. )

image.png

12.查询至少有一门课与学号为’01‘的同学所学相同的同学的信息

  1. select distinct s.*
  2. from Student s
  3. join Score sc
  4. on s.s_id=sc.s_id
  5. where sc.c_id in (select c_id from Score where s_id=01)
  6. AND s.s_id <>01

image.png

*13.查询和01号的同学学习的课程完全相同的其他同学的信息

完全相同

  1. SELECT s.* FROM Student as s
  2. WHERE s.s_id IN(
  3. SELECT sc1.s_id FROM Score sc1
  4. LEFT JOIN (SELECT DISTINCT c_id FROM Score WHERE s_id=01) sc2 ON sc1.c_id=sc2.c_id
  5. WHERE sc1.s_id<>01
  6. GROUP BY sc1.s_id
  7. HAVING 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课程
  8. );

image.png

14.查询没学过‘张三’老师教的任一门课程的学生姓名

  1. select distinct s.s_name
  2. from Student s
  3. where s.s_name not in
  4. (select distinct s.s_name
  5. from Student s
  6. join Score sc
  7. on s.s_id=sc.s_id
  8. join Course c
  9. on sc.c_id=c.c_id
  10. join Teacher t
  11. on c.t_id=t.t_id
  12. where t.t_name ='张三')

image.png

15.查询两门及以上不及格课程的同学的学号姓名及平均成绩

  1. select s.s_name,avg(sc.s_score) as avg
  2. from Student as s
  3. join Score as sc
  4. on s.s_id=sc.s_id
  5. where s.s_id in
  6. (select s_id from Score sc
  7. where s_score<60
  8. group by sc.s_id
  9. HAVING count(*)>=2
  10. )
  11. group by sc.s_id

image.png

16.检索01分数小于60,按分数降序排列的学生信息

  1. select s.*
  2. from Student as s
  3. join Score as sc
  4. on s.s_id=sc.s_id
  5. where sc.c_id=01
  6. and sc.s_score<60
  7. order by sc.s_score desc

image.png

17.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

  1. select sc.*,avg
  2. from Score sc
  3. join (select s_id,avg(s_score) as avg from Score group by s_id) sc2
  4. on sc.s_id=sc2.s_id
  5. order by avg desc

image.png

*18.查询各科成绩最高分、最低分和平均分

以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

—及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
  1. SELECT sc.c_id,c.c_name,max(sc.s_score),min(sc.s_score),avg(sc.s_score) as avg,
  2. SUM(CASE WHEN sc.s_score <=60 THEN 1 ELSE 0 END)/ COUNT( sc.s_id) as '及格率',
  3. SUM(CASE WHEN sc.s_score BETWEEN 70 AND 80 THEN 1 ELSE 0 END)/ COUNT(s_id) as'中等率',
  4. SUM(CASE WHEN sc.s_score BETWEEN 80 AND 90 THEN 1 ELSE 0 END)/ COUNT( s_id) as'优良率',
  5. SUM(CASE WHEN sc.s_score >=90 THEN 1 ELSE 0 END)/ COUNT( sc.s_id)/ COUNT(s_id) as'优秀率'
  6. FROM Score sc
  7. JOIN Course c
  8. on sc.c_id=c.c_id
  9. group by sc.c_id

image.png

19.按各科成绩进行排序,并显示排名

  1. set @rank:=0;
  2. set @prerank:=null;
  3. set @intrank:=1;
  4. select s_id,s_score,c_id,rank
  5. from(
  6. SELECT s_id,s_score,c_id,@rank:=if(@prerank=s_score,@rank,@intrank)as rank,
  7. @intrank:=@intrank+1,
  8. @prerank:=s_score
  9. from Score
  10. order by c_id,s_score desc) r

image.png

20.查询学生的总成绩并进行排名

  1. set @rank:=0;
  2. set @prerank:=null;
  3. set @intrank:=1;
  4. select s_id,s_score,sum,rank
  5. from(
  6. SELECT s_id,s_score,sum(s_score) as 'sum',@rank:=if(@prerank=sum(s_score),@rank,@intrank)as rank,
  7. @intrank:=@intrank+1,
  8. @prerank:=sum(s_score)
  9. from Score
  10. group by s_id
  11. order by sum(s_score) desc) r

image.png

21.查询不同老师所教不同课程平均分从高到低显示

  1. SELECT t_name,t.t_id,avg(s_score) as avg
  2. from Teacher t
  3. join Course c
  4. on t.t_id=c.t_id
  5. join Score s
  6. on c.c_id=s.c_id
  7. group by s.c_id
  8. order by avg(s_score) desc

image.png