30.查询选修了“数据分析”课程的学生学号和成绩,按成绩降序排列
SELECT部分:
-
g.StudentId:学生学号(不是 GradeId)
-
g.Score:成绩
FROM和JOIN部分:
-
FROMGrades g:从成绩表开始查询,使用别名 g -
JOINCourse cUSING(CourseId):通过 CourseId 连接成绩表和课程表 -
注意:USING 子句中的列名要用括号括起来
WHERE部分:
- c.Name = '数据分析':筛选课程名为"数据分析"的记录
ORDER BY部分:
- g.Score
DESC:按成绩降序排列
SELECT g.StudentId,g.Score
FROM Grades g
JOIN Course c
USING (CourseId)
WHERE c.Name = '数据分析'
ORDER BY g.Score DESC;
31.查询马晓燕选修的课程号和成绩
SELECT部分:
-
g.CourseId:课程号
-
g.Score:成绩
FROM和JOIN部分:
-
FROMGrades g:从成绩表开始查询,使用别名 g -
JOIN Student s USING (StudentId):通过
StudentId连接Grades和Student -
注意:USING 子句中的列名要用括号括起来
WHERE部分:
- s.Name = '马晓燕':筛选姓名为"马晓燕"的学生记录
SELECT g.CourseId,g.Score
FROM Grades g
JOIN Student s
USING (StudentId)
WHERE s.Name= '马晓燕'
32.查询平均成绩超过70分的学生学号和平均成绩
SELECT部分:
-
g.StudentId:学生学号
-
AVG(g.Score):计算平均成绩
FROM部分:
- FROM Grades g:从成绩表查询,使用别名 g
GROUP BY部分:
- GROUP BY g.StudentId:按学生学号分组
HAVING部分:
- HAVING
AVG(g.Score)> 70:筛选平均成绩超过70分的学生
- 顺序:
FROM → WHERE → GROUP BY→ HAVING → SELECT → ORDER BY
SELECT g.StudentId,AVG(g.Score)
FROM Grades g
GROUP BY g.StudentId
HAVING AVG(g.Score) > 70;
33.查询所有不姓李的学生的姓名和年龄
SELECT部分:
-
s.Name:学生姓名
-
s.Age:学生年龄
FROM部分:
- FROM Student s:从学生表查询,使用别名 s
WHERE部分:
-
s.Name
NOT LIKE'李%':筛选不姓李的学生 -
%是通配符,表示任意多个字符 -
李%表示以"李"开头的姓名
SELECT s.Name,s.Age
FROM Student s
WHERE s.Name
NOT LIKE '李%';
34.查询成绩前三名的学生学号和成绩
SELECT部分:
-
g.StudentId:学生学号
-
g.Score:成绩
FROM部分:
- FROM Grades g:从成绩表查询,使用别名 g
ORDER BY部分:
-
ORDER BYg.ScoreDESC:按成绩降序排列 -
DESC表示降序(从高到低)
LIMIT部分:
- LIMIT 3:只返回前3条记录
SELECT g.StudentId,g.Score
FROM Grades g
ORDER BY g.Score DESC
LIMIT 3;
35.查询平均成绩超过70分的学生,按平均分降序排列,只显示前5名学生学号(综合)
SELECT部分:
-
s.StudentId:学生学号
-
AVG(g.Score):计算平均成绩
FROM和JOIN部分:
-
FROM Student s:从学生表开始查询
-
JOIN Grades g USING (StudentId):连接成绩表
GROUP BY部分:
- GROUP BY s.StudentId:按学生学号分组
HAVING部分:
- HAVING AVG(g.Score) > 70:筛选平均成绩超过70分的学生
ORDER BY部分:
- ORDER BY AVG(g.Score) DESC:按平均分降序排列
LIMIT部分:
- LIMIT 5:只返回前5条记录
- 判断是否需要分组的方法:
-
如果问题中包含"
每个"、"平均"、"总数"等词,通常需要分组 -
如果只是查询原始数据,通常不需要分组
-
如果使用了聚合函数,通常需要分组
SELECT s.StudentId,AVG(g.Score)
FROM Student s
JOIN Grades g
USING (StudentId)
GROUP BY s.StudentId
HAVING AVG(g.Score) > 70
ORDER BY AVG(g.Score) DESC
LIMIT 5;
36.查询每个学生的平均成绩(需要分组)
SELECT部分:
-
s.StudentId:学生学号
-
AVG(g.Score):计算平均成绩
FROM和JOIN部分:
-
FROM Student s:从学生表开始查询
-
JOIN Grades g USING (StudentId):连接成绩表
GROUP BY部分:
- GROUP BY s.StudentId:按学生学号分组
SELECT s.StudentId,AVG(g.Score)
FROM Student s
JOIN Grades g
USING (StudentId)
GROUp BY s.StudentId;
37.查询课程‘001’的所有成绩(不需要分组)
SELECT部分:
-
StudentId:学生学号
-
Score:成绩
FROM部分:
- FROM Grades:从成绩表查询
WHERE部分:
- CourseId = '001':筛选课程号为"001"的记录
SELECT StudentId, Score
FROM Grades
WHERE CourseId = '001';
38.查询总成绩为前3名的学生学号和成绩
SELECT部分:
-
s.StudentId:学生学号
-
SUM(g.Score):计算总成绩
FROM和JOIN部分:
-
FROM Student s:从学生表开始查询
-
JOINGrades gUSING(StudentId):连接成绩表
GROUP BY部分:
- GROUP BY s.StudentId:按学生学号分组
ORDER BY部分:
- ORDER BY SUM(g.Score)
DESC:按总成绩降序排列
LIMIT部分:
- LIMIT 3:只返回前3条记录
SELECT s.StudentId,SUM(g.Score)
FROM Student s
JOIN Grades g
USING (StudentId)
GROUP BY s.StudentId
ORDER BY SUM(g.Score) DESC
LIMIT 3;
39.查询选修了2门(不含2门)课程以上的学生学号
SELECT部分:
- g.StudentId:学生学号
FROM部分:
- FROM Grades g:从成绩表查询,使用别名 g
GROUP BY部分:
- GROUP BY g.StudentId:按学生学号分组
HAVING部分:
- HAVING COUNT(g.CourseId) > 2:筛选选修课程数超过2门的学生
COUNT部分
- COUNT 函数统计每个学生选修的课程数
SELECT g.StudentId
FROM Grades g
GROUP BY g.StudentId
HAVING COUNT(g.CourseId) > 2;