MySQL实验

  1. 1 背景
  2. 2 表格及其代码
    1. 2.1 所选表格样式
    2. 2.2 具体问题
      1. 2.2.1 求选修了老师“王刚”开课课程且成绩在90分以上的学生姓名、课程名称和成绩;(姓名,课程名,成绩)
      2. 2.2.2 求选修了“王刚”老师所授全部课程的学生姓名和学院名称;(姓名,学院名称)
      3. 2.2.3 求没有选修课程“软件工程”的学生学号和姓名;(学生学号,姓名)
      4. 2.2.4 求至少选修了两门课程的学生学号;(学号)
      5. 2.2.5 求课程“经济学”不及格学生姓名和考试成绩;(姓名,成绩)
      6. 2.2.6 求至少选修了与学号“T06” 同学选修的课程相同的学生学号;(学号)
      7. 2.2.7 求至少选修了“C3,C4”两门课程的学生姓名和学院名称;(姓名,学院名称)
      8. 2.2.8 查询“王石”同学没有选修的课程号和课程名; (课程号,课程名)
      9. 2.2.9 查询没有被任何学生选修的课程的课程号;(课程号)
      10. 2.2.10 求选修了全部课程的学生姓名;(姓名)
      11. 2.2.11 查询各学院课程“经济学”的平均分,并按照成绩从高到低的顺序排列;(学院名称,平均分)
      12. 2.2.12 查询选修课程“经济学”的学生姓名和所在院系,结果按各院系排列,同时成绩从高到低排列;(姓名,学院名称,成绩)
      13. 2.2.13 求学时在30-45之间(含30和45)的课程的课程号和课程名称及授课教师;(课程号,课程名,教师姓名)
      14. 2.2.14 检索选修课程“经济学”的最高分学生的姓名;(姓名)
      15. 2.2.15 查询选课人数超过5人的课程的课程号及课程名;(课程号,课程名)

1 背景

以前做过的MySQL的实验都快忘了,值此双十一之际竟然找到了,所以就拿来记录一波……

2 表格及其代码

2.1 所选表格样式

学生

教师

学习

课程

学院

开课

2.2 具体问题

2.2.1 求选修了老师“王刚”开课课程且成绩在90分以上的学生姓名、课程名称和成绩;(姓名,课程名,成绩)

1
2
3
4
5
6
7
SELECT 学生.姓名,课程名,成绩 FROM 教师,开课,课程,学习,学生
WHERE 教师姓名='王刚'
AND 教师.教师号=开课.教师号
AND 开课.课程号=课程.课程号
AND 课程.课程号=学习.课程号
AND 学生.学号=学习.学号
AND 成绩>90;

2.2.2 求选修了“王刚”老师所授全部课程的学生姓名和学院名称;(姓名,学院名称)

1
2
3
4
5
6
7
8
9
10
SELECT 姓名,学院名称 FROM 学生,学院
WHERE 学生.学院代码=学院.学院代码
AND NOT EXISTS
(SELECT * FROM 教师,开课
WHERE 教师.教师姓名='王刚'
AND 教师.教师号=开课.教师号
AND NOT EXISTS
(SELECT * FROM 学习,课程,学生 AS S
WHERE S.学号=学习.学号
AND 课程.课程号=学习.课程号));

2.2.3 求没有选修课程“软件工程”的学生学号和姓名;(学生学号,姓名)

1
2
3
4
5
6
SELECT 学生.学号,姓名 FROM 学生
WHERE NOT EXISTS
(SELECT * FROM 学习,课程
WHERE 学生.学号=学习.学号
AND 课程.课程号=学习.课程号
AND 课程.课程名='软件工程');

2.2.4 求至少选修了两门课程的学生学号;(学号)

1
2
3
SELECT 学号 FROM 学习
GROUP BY 学号
HAVING COUNT(课程号)>1;

2.2.5 求课程“经济学”不及格学生姓名和考试成绩;(姓名,成绩)

1
2
3
4
5
SELECT 姓名,成绩 FROM 学生,学习,课程
WHERE 学生.学号=学习.学号
AND 课程.课程号=学习.课程号
AND 课程.课程名='经济学'
AND 成绩<60;

2.2.6 求至少选修了与学号“T06” 同学选修的课程相同的学生学号;(学号)

1
2
3
4
5
6
7
8
SELECT DISTINCT 学号 FROM 学习 AS SC1
WHERE NOT EXISTS
(SELECT * FROM 学习 AS SC2
WHERE SC2.学号='T06'
AND NOT EXISTS
(SELECT * FROM 学习 AS SC3
WHERE SC1.学号=SC3.学号
AND SC2.课程号=SC3.课程号));

2.2.7 求至少选修了“C3,C4”两门课程的学生姓名和学院名称;(姓名,学院名称)

1
2
3
4
5
6
7
8
9
SELECT 姓名,学院名称 FROM 学生,学院
WHERE 学生.学院代码=学院.学院代码
AND NOT EXISTS
(SELECT * FROM 课程
WHERE 课程号 IN ('C3','C4')
AND NOT EXISTS
(SELECT * FROM 学习
WHERE 学生.学号=学习.学号
AND 学习.课程号=课程.课程号));

2.2.8 查询“王石”同学没有选修的课程号和课程名; (课程号,课程名)

1
2
3
4
5
SELECT 课程号,课程名 FROM 课程
WHERE 课程号 NOT IN
(SELECT 课程号 FROM 学习,学生
WHERE 学生.学号=学习.学号
AND 姓名='王石');

2.2.9 查询没有被任何学生选修的课程的课程号;(课程号)

1
2
3
4
SELECT 课程号 FROM 课程
WHERE 课程号 NOT IN
(SELECT 课程号 FROM 学习
WHERE 学习.学号=课程.课程号);

2.2.10 求选修了全部课程的学生姓名;(姓名)

1
2
3
4
5
6
7
SELECT 姓名 FROM 学生
WHERE NOT EXISTS
(SELECT * FROM 课程
WHERE NOT EXISTS
(SELECT * FROM 学习
WHERE 学习.学号=学生.学号
AND 课程.课程号=学习.课程号));

2.2.11 查询各学院课程“经济学”的平均分,并按照成绩从高到低的顺序排列;(学院名称,平均分)

1
2
3
4
5
6
7
SELECT 学院名称,AVG(成绩) AS 平均分 FROM 学院,学习,学生,课程
WHERE 学生.学院代码=学院.学院代码
AND 学习.学号=学生.学号
AND 学习.课程号=课程.课程号
AND 课程名='经济学'
GROUP BY 学院名称
ORDER BY AVG(成绩) DESC;

2.2.12 查询选修课程“经济学”的学生姓名和所在院系,结果按各院系排列,同时成绩从高到低排列;(姓名,学院名称,成绩)

1
2
3
4
5
6
SELECT 姓名,学院名称,成绩 FROM 学生,学院,学习,课程
WHERE 学生.学号=学习.学号
AND 学生.学院代码=学院.学院代码
AND 课程.课程号=学习.课程号
AND 课程名='经济学'
ORDER BY 学院名称,成绩 DESC;

2.2.13 求学时在30-45之间(含30和45)的课程的课程号和课程名称及授课教师;(课程号,课程名,教师姓名)

1
2
3
4
SELECT 课程.课程号,课程.课程名,教师.教师姓名 FROM 课程,教师,开课
WHERE 课程.学时 BETWEEN 30 AND 45
AND 教师.教师号=开课.教师号
AND 开课.课程号=课程.课程号;

2.2.14 检索选修课程“经济学”的最高分学生的姓名;(姓名)

1
2
3
4
5
6
7
8
SELECT 姓名 FROM 学生,课程,学习
WHERE 学生.学号=学习.学号
AND 学习.课程号=课程.课程号
AND 课程.课程名='经济学'
AND 学习.成绩>=ALL
(SELECT 成绩 FROM 学习,课程
WHERE 学习.课程号=课程.课程号
AND 课程.课程名='经济学');

2.2.15 查询选课人数超过5人的课程的课程号及课程名;(课程号,课程名)

1
2
3
4
5
6
7
8
9
SELECT 课程.课程号,课程.课程名 FROM 课程

WHERE 课程.课程号 IN

(SELECT 学习.课程号 FROM 学习

GROUP BY 学习.课程号

HAVING COUNT(学习.学号)>5);

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。

×

喜欢就点赞,疼爱就打赏