文章目录
- 前篇(1)和后篇(3)
- 题解
-
- 12、查询和“01”号同学所学课程完全相同的其他同学的学号(!)
- 13、查询没学过"张三"老师讲授的任一门课程的学生姓名(?)
- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
- 16、检索"01"课程分数小于60,按分数降序排列的学生信息
- 17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
- 18、查询各科成绩最高分、最低分和平均分:以如下形式显示:
- 19、按各科成绩进行排序,并显示排名
- 20、查询学生的总成绩并进行排名
- 21 、查询不同老师所教不同课程平均分从高到低显示
- 22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
- 23、使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称
- 24、查询学生平均成绩及其名次
- 25、查询各科成绩前三名的记录(不考虑成绩并列情况)
- 26、查询每门课程被选修的学生数
- 27、查询出只有两门课程的全部学生的学号和姓名
- 28、查询男生、女生人数
- 29、查询名字中含有"风"字的学生信息
- 31、查询1990年出生的学生名单
前篇(1)和后篇(3)
若有帮助欢迎点赞、收藏、评论~
题解
12、查询和“01”号同学所学课程完全相同的其他同学的学号(!)
## 好吧,网上居然有人跟我一样用这种奇葩解法(个人觉得并不严谨——万一顺序不同所求字符串就不一样了)
SELECT m.s_id
FROM (
SELECT s_id,
GROUP_CONCAT(c_id) c_str
FROM Score
GROUP BY s_id
) m
WHERE c_str = (SELECT GROUP_CONCAT(c_id)
FROM Score
WHERE s_id = '01');
13、查询没学过"张三"老师讲授的任一门课程的学生姓名(?)
## 这题在不断调试中做出来
WITH target_course_id AS # 满足条件的所有课程id临时表
(
SELECT c_id
FROM Course
WHERE t_id = (SELECT t_id FROM Teacher WHERE t_name = "张三")
),
target_course_cnt AS # 满足c_id条件的计数表
(
SELECT s_id,
IF(c_id IN (SELECT * FROM target_course_id), 1, 0) c_id_cnt
FROM Score
)
SELECT st.s_name
FROM Student st
JOIN
(SELECT m.s_id
FROM (
SELECT s_id,
SUM(c_id_cnt) cnt
FROM target_course_cnt # 计数临时表
GROUP BY s_id
) m # 满足条件课程的个数
WHERE m.cnt = (SELECT COUNT(*) FROM target_course_id) # 满足条件的课程id临时表
) n # 满足条件的 学生id
ON n.s_id = st.s_id;
15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT st.s_id, st.s_name
FROM Student st
JOIN
(
SELECT s_id,
SUM(IF(s_score < 60, 1, 0)) sum_score
FROM Score
GROUP BY s_id
HAVING sum_score >= 2
) m
ON st.s_id = m.s_id
16、检索"01"课程分数小于60,按分数降序排列的学生信息
SELECT st.s_id, st.s_name, st.s_birth, st.s_sex
FROM Student st
JOIN Score sc
WHERE sc.c_id = '01' AND sc.s_score < 60
ORDER BY sc.s_score DESC
17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT sc.s_id, sc.s_score, m.avg_score
FROM Score sc
LEFT JOIN
(SELECT s_id,
AVG(s_score) avg_score
FROM Score
GROUP BY s_id
) m
ON sc.s_id = m.s_id