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

109 阅读4分钟

11.查询没有成绩的学生的学号,课程号和成绩

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

  • CourseId:课程编号

  • Score:成绩

  1. FROM 部分:
  • FROM Grades:从成绩表查询
  1. WHERE 部分:
  • Score IS NULL:筛选成绩为空的记录
  1. IS NULL 说明:
  • IS NULL:用于检查字段值是否为空

  • 空值(NULL)表示:

  1. 没有值

  2. 未知值

  3. 未填写

  4. 不适用

SELECT StudentId, CourseId, Score
FROM Grades
WHERE Score IS NULL;

12.查询选修课程号为“001”的学生的学号,课程号和分数,结果按照分数降序排列

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

  • CourseId:课程编号

  • Score:成绩

  1. FROM 部分:
  • FROM Grades:从成绩表查询
  1. WHERE 部分:
  • CourseId = '001':筛选课程号为001的记录
  1. ORDER BY 部分:
  • ORDER BY Score DESC:按成绩降序排列

  • DESC:降序(从高到低)

  • 如果不写 DESC,默认为 ASC(升序)

SELECT StudentId,CourseId,Score
FROM Grades
WHERE CourseID = '001'
ORDER BY Score DESC;

13.查询学生总人数

  1. SELECT 部分:
  • COUNT(*):计算表中的记录总数

  • *:表示所有列

  • 这个函数会返回一个数字

  1. FROM 部分:
  • FROM Student:从学生表查询
  1. COUNT 函数说明:
  • 3.1返回一个整数,表示记录

  • 3.2. COUNT(*):计算所有记录数,包括NULL值

    例如

    SELECT COUNT(*) FROM Student;
    
  • 3.3. COUNT(字段名):计算指定字段的非NULL值数量

    例如

    SELECT COUNT(Age) FROM Student;
    
SELECT COUNT(*)
FROM Student;

14.查询CS系学生的系名和平均年龄

  1. SELECT 部分:
  • Department:系名

  • AVG(Age):计算平均年龄

  1. WHERE 条件:
  • Department = 'CS':筛选 CS 系的学生
  1. GROUP BY
  • Department:按系分组

  • 因为使用了聚合函数 AVG,所以需要分组

SELECT Department,AVG(Age)
FROM Student
WHERE Department = 'CS'
GROUP BY Department;

15.查询选修各门课程的最高,最低与平均成绩

聚合函数:MAX(最高),MIN(最低),AVG(平均成绩)

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

  • MAX(Score):最高成绩

  • MIN(Score):最低成绩

  • AVG(Score):平均成绩

  1. GROUP BY:
  • CourseId:按课程分组

  • 因为使用了聚合函数,所以需要分组

SELECT CourseId,MAX(Score),MIN(Score),AVG(Score)
FROM Grades
GROUP BY CourseId;

16.查询各系,各班级的人数和平均年龄,按班级人数倒序排列'

  1. SELECT 部分:
  • Department:系名

  • Class:班级

  • COUNT(*):统计人数

  • AVG(Age):计算平均年龄

  1. GROUP BY
  • Department, Class:按系和班级分组

  • 因为使用了聚合函数,所以需要分组

  1. ORDER BY
  • student_count DESC:按人数降序排列
SELECT Department,Class,COUNT(*),AVG(Age)
FROM Student
GROUP BY Department,Class
ORDER BY COUNT(*) DESC;

17.分组查询,求学生人数不足5人的系及其相应的学生数

  1. SELECT 部分:
  • Department:系名

  • COUNT(*):统计人数

  1. GROUP BY
  • Department:按系分组

  • 因为使用了聚合函数,所以需要分组

  1. HAVING
  • COUNT(*) < 5:筛选人数少于5人的系

  • HAVING 用于对分组后的结果进行筛选

SELECT Department,COUNT(*)
FROM Student
GROUP BY Department
HAVING COUNT(*) < 5;

18.求学生学号,姓名及其选修课程的课程ID和成绩

18.1.USING子句

  1. 使用 USING 的情况:
  • 列名完全相同

  • 只需要简单连接

  • 想要简洁的代码

SELECT StudentId,Name,CourseId,Score  
FROM Student  
JOIN Grades  
USING (StudentId);  

18.2.ON子句

  1. 使用 ON 的情况:
  • 需要明确的连接条件

  • 列名不完全相同

  • 需要复杂的连接条件

SELECT StudentId,Name,CourseId,Score  
FROM Student  
JOIN Grades  
ON student.StudentId= Grades.StudentId;  

18.3.表列名和ON子句

  1. 使用表别名+ON 的情况:
  • 多表连接

  • 需要清晰的代码结构

  • 复杂的查询

SELECT s.StudentId,s.Name,g.CourseId,g.Score  
FROM Student s  
JOIN Grades g  
ON s.StudentId= g.StudentId;  

18.4.NATURAL JOIN子句

  1. 使用 NATURAL JOIN 的情况:
  • 两个表有多个相同列

  • 需要自动匹配所有相同列

  • 想要最简单的代码

SELECT StudentId,Name,CourseId,Score  
FROM Student  
NATURAL JOIN Grades;  

在实际应用中,表别名+ON 的方式最常用,因为它最灵活且最清晰。

19.查询课程号为‘001’且成绩在70以下或成绩在90以上的学生姓名,课程名和成绩

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

  • c.Name:课程名称

  • g.Score:成绩

  1. JOIN 和 USING 部分:
  • JOIN Grades g USING (StudentId):通过 StudentId 连接 StudentGrades

  • JOIN Course c USING (CourseId):通过 CourseId 连接 GradesCourse 表

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

  1. WHERE 部分:
  • g.CourseId = '001':筛选课程号为'001'的记录

  • (g.Score < 70 OR g.Score > 90):筛选成绩在70以下或90以上的记录

SELECT s.Name,c.Name,g.Score
FROM Student s
JOIN Grades g 
USING (StudentId)
JOIN Course c 
USING (CourseId)
WHERE g.CourseId = '001'
AND (g.Score < 70 OR g.Score > 90);

20.求在数据分析考试中成绩排名前两位的学生的学号,姓名,课程号和成绩(limit count:限制输出的行数)

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

  • s.Name:学生姓名

  • c.CourseId:课程编号

  • g.Score:成绩

  1. JOINUSING 部分:
  • JOIN Grades g USING (StudentId):通过 StudentId 连接 StudentGrades

  • JOIN Course c USING (CourseId):通过CourseId 连接 GradesCourse 表

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

  1. WHERE 部分:
  • c.Name = '数据分析':筛选课程名为"数据分析"的记录
  1. ORDER BY 部分:
  • g.Score DESC:按成绩降序排列
  1. LIMIT部分:
  • LIMIT 2:限制只显示前两行记录
SELECT s.StudentId,s.Name,c.CourseId,g.Score
FROM Student s
JOIN Grades g
USING (StudentId)
JOIN Course c
USING (CourseId)
WHERE c.Name = '数据分析'
ORDER BY g.Score DESC
LIMIT 2;