当前位置:   article > 正文

MySQL15道经典练习题_mysql练习题

mysql练习题

前言:本期博客就不标明目录了,我们直接上题目,这一期内容主要是唤醒哪些沉睡在大家心中的之前的SqlServer与oralc的知识点,以及巩固我们的MySQL,其中较难的知识点可能就是联表了,什么内联,外联,左联右联让人头皮发麻,但是不要慌,跟着小刘的步伐慢慢理清思路

首先是我们的建表,这里已经把需要的表的代码都交代上了

一共四张表,学生,教师,成绩,课程

  1. CREATE TABLE t_student(
  2. sid VARCHAR(10),
  3. sname varchar(10),
  4. sage date,
  5. ssex CHAR
  6. )
  7. create table t_teacher(
  8. tid VARCHAR(10),
  9. tname VARCHAR(10)
  10. )
  11. create table t_course(
  12. cid VARCHAR(10),
  13. cname varchar(10),
  14. tid VARCHAR(10)
  15. )
  16. create table t_score(
  17. sid varchar(10),
  18. cid varchar(10),
  19. score float
  20. )
  21. select * from t_student
  22. select * from t_teacher
  23. select * from t_course
  24. select * from t_score
  25. -- 学生表
  26. insert into t_student values('01' , '赵雷' , '1990-01-01' , '男');
  27. insert into t_student values('02' , '钱电' , '1990-12-21' , '男');
  28. insert into t_student values('03' , '孙风' , '1990-12-20' , '男');
  29. insert into t_student values('04' , '李云' , '1990-12-06' , '男');
  30. insert into t_student values('05' , '周梅' , '1991-12-01' , '女');
  31. insert into t_student values('06' , '吴兰' , '1992-01-01' , '女');
  32. insert into t_student values('07' , '郑竹' , '1989-01-01' , '女');
  33. insert into t_student values('09' , '张三' , '2017-12-20' , '女');
  34. insert into t_student values('10' , '李四' , '2017-12-25' , '女');
  35. insert into t_student values('11' , '李四' , '2012-06-06' , '女');
  36. insert into t_student values('12' , '赵六' , '2013-06-13' , '女');
  37. insert into t_student values('13' , '孙七' , '2014-06-01' , '女');
  38. -- 教师表
  39. insert into t_teacher values('01' , '张三');
  40. insert into t_teacher values('02' , '李四');
  41. insert into t_teacher values('03' , '王五');
  42. -- 课程表
  43. insert into t_course values('01' , '语文' , '02');
  44. insert into t_course values('02' , '数学' , '01');
  45. insert into t_course values('03' , '英语' , '03');
  46. -- 成绩表
  47. insert into t_score values('01' , '01' , 80);
  48. insert into t_score values('01' , '02' , 90);
  49. insert into t_score values('01' , '03' , 99);
  50. insert into t_score values('02' , '01' , 70);
  51. insert into t_score values('02' , '02' , 60);
  52. insert into t_score values('02' , '03' , 80);
  53. insert into t_score values('03' , '01' , 80);
  54. insert into t_score values('03' , '02' , 80);
  55. insert into t_score values('03' , '03' , 80);
  56. insert into t_score values('04' , '01' , 50);
  57. insert into t_score values('04' , '02' , 30);
  58. insert into t_score values('04' , '03' , 20);
  59. insert into t_score values('05' , '01' , 76);
  60. insert into t_score values('05' , '02' , 87);
  61. insert into t_score values('06' , '01' , 31);
  62. insert into t_score values('06' , '03' , 34);
  63. insert into t_score values('07' , '02' , 89);
  64. insert into t_score values('07' , '03' , 98);

 然后来看看我们的题目:

01)查询" 01 "课程比" 02 "成绩高的学生的信息及课程分数
02)查询同时存在" 01 "课程和" 02 "课程的情况
03)查询存在" 01 "课程但可能不存在" 02 "课程的情况不存在时显示为 null )
04)查询不存在" 01 "课程但存在" 02 "课程的情况
05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
06)查询在t_score表存在成绩的学生信息
07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
08)查询「李」姓老师的数量

09)查询学过「张三」老师授课的同学的信息
10)查询没有学全所有课程的同学的信息
11)查询没学过"张三"老师讲授的任一门课程的学生姓名
12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息
14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
15)查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

 接下来就是我们的解题部分

01)查询" 01 "课程比" 02 "成绩高的学生的信息及课程分数
语句:

  1. select a.*,b.score 语文,c.score 数学 from t_student as a
  2. inner JOIN t_score as b
  3. on a.sid = b.sid
  4. inner join t_score as c
  5. on a.sid=c.sid and b.cid='01' and c.cid='02'
  6. where b.score>c.score

结果:


02)查询同时存在" 01 "课程和" 02 "课程的情况
语句:

  1. select * from t_score as a inner join t_score as b on a.sid=b.sid where a.cid='01' and b.cid='02'

结果:

 03)查询存在" 01 "课程但可能不存在" 02 "课程的情况不存在时显示为 null )

语句:

select * from t_score as a inner join t_score as b on a.sid=b.sid and b.cid='02' where a.cid='01'

结果:

 04)查询不存在" 01 "课程但存在" 02 "课程的情况
语句:

select * from t_score where sid not in (select sid from t_score  where cid ='01' ) and cid ='02'

 结果:

05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
语句:

  1. select a.sid,a.sname,avg_cj from t_student as a
  2. inner join(
  3. select sid, AVG(score) As avg_cj
  4. from t_score
  5. group by sid
  6. having AVG(score) >=60) as b on a.sid=b.sid;

结果:

06)查询在t_score表存在成绩的学生信息

语句:

  1. select  a.sid,a.sname,b.ct,b.sum_score
  2. from t_student as a
  3. left join (select sid,count(cid) as ct,sum(score) as sum_score
  4. from t_score
  5. group by sid)as b on a.sid = b.sid;
  6. )

结果:


07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
语句:

  1. select  a.sid,a.sname,b.ct,b.sum_score
  2. from t_student as a
  3. left join (select sid,count(cid) as ct,sum(score) as sum_score
  4. from t_score
  5. group by sid)as b on a.sid = b.sid;
  6. )

结果:


08)查询「李」姓老师的数量
语句:

select count(*) from t_teacher where tname like'李%';

结果:


09)查询学过「张三」老师授课的同学的信息
语句: 

select a.*,c.tname  from t_student a , t_score b ,t_teacher c ,t_course d where a.sid=b.sid and b.cid = d.cid and d.tid = c.tid and b.cid='01'

结果:


10)查询没有学全所有课程的同学的信息
语句:

  1. select  a.*,ct
  2. from t_student as a
  3. inner join (select sid,count(cid) as ct
  4.                         from t_score
  5.                         group by sid
  6.                         having ct <(select count(cid) from t_course))as b on a.sid = b.sid
  7. )

结果:


11)查询没学过"张三"老师讲授的任一门课程的学生姓名

语句:

  1. SELECT Sname
  2. FROM t_student AS a
  3. WHERE SId NOT IN (SELECT SId
  4.                   FROM t_score AS a
  5.                   LEFT JOIN t_course AS b
  6.                   ON a.CId = b.CId
  7.                   INNER JOIN t_teacher AS c
  8.                   ON b.TId = c.TId
  9.                   WHERE Tname = '张三');

结果:


12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

语句:

  1. SELECT a.Sid,a.Sname,AVG(c.score) AS avg_score
  2. FROM t_student AS a
  3. INNER JOIN (SELECT Sid,COUNT(Cid)AS num
  4. FROM t_score
  5. WHERE score < 60
  6. GROUP BY Sid
  7. HAVING num >= 2)AS b
  8. ON a.Sid = b.Sid
  9. INNER JOIN t_score AS c
  10. ON b.Sid = c.Sid
  11. GROUP BY a.Sid;

结果:


13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息

语句:

  1. SELECT b.*,a.score
  2. FROM(SELECT SId,score
  3. FROM t_score
  4. WHERE CId = '01' AND score < 60) AS a
  5. LEFT JOIN t_student AS b
  6. ON a.SId = b.SId
  7. ORDER BY a.score DESC;

结果:


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

语句:

  1. SELECT b.*,a.score
  2. FROM(SELECT SId,score
  3.      FROM t_score
  4.      WHERE CId = '01' AND score < 60) AS a
  5. LEFT JOIN t_student AS b
  6. ON a.SId = b.SId
  7. ORDER BY a.score DESC;

结果:


15)查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

语句:

  1. SELECT a.*,b.Cname
  2. FROM(SELECT 
  3.      CId,
  4.      COUNT(*)   AS 选修人数,
  5.      MAX(score) AS 最高分,
  6.      MIN(score) AS 最低分,
  7.      AVG(score) AS 平均分,
  8.      SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*) AS 及格率,
  9.      SUM(CASE WHEN score >= 70 AND score < 80 THEN 1 ELSE 0 END) / COUNT(*) AS 中等率,
  10.      SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优良率,
  11.      SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优秀率
  12.      FROM t_score
  13.      GROUP BY CId
  14.      ORDER BY COUNT(*) DESC,CId ASC) AS a
  15. LEFT JOIN t_course AS b
  16. ON a.CId = b.CId;

结果:

 ok,今日的练习就到此结束了,明天也要继续加油哦!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号