数据库编程应用--查询专题4

58 阅读4分钟

30.查询选修了“数据分析”课程的学生学号和成绩,按成绩降序排列

  1. SELECT 部分:
  • g.StudentId:学生学号(不是 GradeId)

  • g.Score:成绩

  1. FROMJOIN 部分:
  • FROM Grades g:从成绩表开始查询,使用别名 g

  • JOIN Course c USING (CourseId):通过 CourseId 连接成绩表和课程表

  • 注意:USING 子句中的列名要用括号括起来

  1. WHERE 部分:
  • c.Name = '数据分析':筛选课程名为"数据分析"的记录
  1. 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.查询马晓燕选修的课程号和成绩

  1. SELECT 部分:
  • g.CourseId:课程号

  • g.Score:成绩

  1. FROMJOIN 部分:
  • FROM Grades g:从成绩表开始查询,使用别名 g

  • JOIN Student s USING (StudentId):通过 StudentId 连接GradesStudent

  • 注意:USING 子句中的列名要用括号括起来

  1. WHERE 部分:
  • s.Name = '马晓燕':筛选姓名为"马晓燕"的学生记录
SELECT g.CourseId,g.Score
FROM Grades g
JOIN Student s
USING (StudentId)
WHERE s.Name= '马晓燕'

32.查询平均成绩超过70分的学生学号和平均成绩

  1. SELECT 部分:
  • g.StudentId:学生学号

  • AVG(g.Score):计算平均成绩

  1. FROM 部分:
  • FROM Grades g:从成绩表查询,使用别名 g
  1. GROUP BY 部分:
  • GROUP BY g.StudentId:按学生学号分组
  1. HAVING 部分:
  • HAVING AVG(g.Score) > 70:筛选平均成绩超过70分的学生
  1. 顺序:

FROMWHEREGROUP BYHAVINGSELECTORDER BY

SELECT g.StudentId,AVG(g.Score)
FROM Grades g
GROUP BY g.StudentId
HAVING AVG(g.Score) > 70;

33.查询所有不姓李的学生的姓名和年龄

  1. SELECT 部分:
  • s.Name:学生姓名

  • s.Age:学生年龄

  1. FROM 部分:
  • FROM Student s:从学生表查询,使用别名 s
  1. WHERE 部分:
  • s.Name NOT LIKE '李%':筛选不姓李的学生

  • % 是通配符,表示任意多个字符

  • 李% 表示以"李"开头的姓名

SELECT s.Name,s.Age
FROM Student s
WHERE s.Name 
NOT LIKE '李%';

34.查询成绩前三名的学生学号和成绩

  1. SELECT 部分:
  • g.StudentId:学生学号

  • g.Score:成绩

  1. FROM 部分:
  • FROM Grades g:从成绩表查询,使用别名 g
  1. ORDER BY 部分:
  • ORDER BY g.Score DESC:按成绩降序排列

  • DESC 表示降序(从高到低)

  1. LIMIT 部分:
  • LIMIT 3:只返回前3条记录
SELECT g.StudentId,g.Score
FROM Grades g 
ORDER BY g.Score DESC
LIMIT 3;

35.查询平均成绩超过70分的学生,按平均分降序排列,只显示前5名学生学号(综合)

  1. SELECT 部分:
  • s.StudentId:学生学号

  • AVG(g.Score):计算平均成绩

  1. FROMJOIN 部分:
  • FROM Student s:从学生表开始查询

  • JOIN Grades g USING (StudentId):连接成绩表

  1. GROUP BY 部分:
  • GROUP BY s.StudentId:按学生学号分组
  1. HAVING 部分:
  • HAVING AVG(g.Score) > 70:筛选平均成绩超过70分的学生
  1. ORDER BY 部分:
  • ORDER BY AVG(g.Score) DESC:按平均分降序排列
  1. LIMIT 部分:
  • LIMIT 5:只返回前5条记录
  1. 判断是否需要分组的方法:
  • 如果问题中包含"每个"、"平均"、"总数"等词,通常需要分组

  • 如果只是查询原始数据,通常不需要分组

  • 如果使用了聚合函数,通常需要分组

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.查询每个学生的平均成绩(需要分组)

  1. SELECT 部分:
  • s.StudentId:学生学号

  • AVG(g.Score):计算平均成绩

  1. FROMJOIN 部分:
  • FROM Student s:从学生表开始查询

  • JOIN Grades g USING (StudentId):连接成绩表

  1. 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’的所有成绩(不需要分组)

  1. SELECT 部分:
  • StudentId:学生学号

  • Score:成绩

  1. FROM 部分:
  • FROM Grades:从成绩表查询
  1. WHERE 部分:
  • CourseId = '001':筛选课程号为"001"的记录
SELECT StudentId, Score
FROM Grades
WHERE CourseId = '001';

38.查询总成绩为前3名的学生学号和成绩

  1. SELECT 部分:
  • s.StudentId:学生学号

  • SUM(g.Score):计算总成绩

  1. FROM 和 JOIN 部分:
  • FROM Student s:从学生表开始查询

  • JOIN Grades g USING (StudentId):连接成绩表

  1. GROUP BY 部分:
  • GROUP BY s.StudentId:按学生学号分组
  1. ORDER BY 部分:
  • ORDER BY SUM(g.Score) DESC:按总成绩降序排列
  1. 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门)课程以上的学生学号

  1. SELECT 部分:
  • g.StudentId:学生学号
  1. FROM 部分:
  • FROM Grades g:从成绩表查询,使用别名 g
  1. GROUP BY 部分:
  • GROUP BY g.StudentId:按学生学号分组
  1. HAVING 部分:
  • HAVING COUNT(g.CourseId) > 2:筛选选修课程数超过2门的学生
  1. COUNT 部分
  • COUNT 函数统计每个学生选修的课程数
SELECT g.StudentId
FROM Grades g
GROUP BY g.StudentId
HAVING COUNT(g.CourseId) > 2;