11.查询没有成绩的学生的学号,课程号和成绩
SELECT部分:
-
StudentId:学生学号
-
CourseId:课程编号
-
Score:成绩
FROM部分:
- FROM Grades:从成绩表查询
WHERE部分:
- Score IS NULL:筛选成绩为空的记录
IS NULL说明:
-
IS NULL:用于检查字段值是否为空
-
空值(NULL)表示:
-
没有值
-
未知值
-
未填写
-
不适用
SELECT StudentId, CourseId, Score
FROM Grades
WHERE Score IS NULL;
12.查询选修课程号为“001”的学生的学号,课程号和分数,结果按照分数降序排列
SELECT部分:
-
StudentId:学生学号
-
CourseId:课程编号
-
Score:成绩
FROM部分:
- FROM Grades:从成绩表查询
WHERE部分:
- CourseId = '001':筛选课程号为001的记录
ORDER BY部分:
-
ORDER BY Score DESC:按成绩降序排列
-
DESC:降序(从高到低) -
如果不写 DESC,默认为 ASC(升序)
SELECT StudentId,CourseId,Score
FROM Grades
WHERE CourseID = '001'
ORDER BY Score DESC;
13.查询学生总人数
SELECT部分:
-
COUNT(*):计算表中的记录总数
-
*:表示所有列
-
这个函数会返回一个数字
FROM部分:
- FROM Student:从学生表查询
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系学生的系名和平均年龄
SELECT部分:
-
Department:系名
-
AVG(Age):计算平均年龄
WHERE条件:
- Department = 'CS':筛选 CS 系的学生
GROUP BY:
-
Department:按系分组
-
因为使用了聚合函数
AVG,所以需要分组
SELECT Department,AVG(Age)
FROM Student
WHERE Department = 'CS'
GROUP BY Department;
15.查询选修各门课程的最高,最低与平均成绩
聚合函数:MAX(最高),MIN(最低),AVG(平均成绩)
SELECT部分:
-
CourseId:课程编号
-
MAX(Score):最高成绩
-
MIN(Score):最低成绩
-
AVG(Score):平均成绩
GROUP BY:
-
CourseId:按课程分组
-
因为使用了聚合函数,所以需要分组
SELECT CourseId,MAX(Score),MIN(Score),AVG(Score)
FROM Grades
GROUP BY CourseId;
16.查询各系,各班级的人数和平均年龄,按班级人数倒序排列'
SELECT部分:
-
Department:系名
-
Class:班级
-
COUNT(*):统计人数
-
AVG(Age):计算平均年龄
GROUP BY:
-
Department, Class:按系和班级分组
-
因为使用了聚合函数,所以需要分组
ORDER BY:
- student_count DESC:按人数降序排列
SELECT Department,Class,COUNT(*),AVG(Age)
FROM Student
GROUP BY Department,Class
ORDER BY COUNT(*) DESC;
17.分组查询,求学生人数不足5人的系及其相应的学生数
SELECT部分:
-
Department:系名
-
COUNT(*):统计人数
GROUP BY:
-
Department:按系分组
-
因为使用了聚合函数,所以需要分组
HAVING:
-
COUNT(*) < 5:筛选人数少于5人的系
-
HAVING 用于对分组后的结果进行筛选
SELECT Department,COUNT(*)
FROM Student
GROUP BY Department
HAVING COUNT(*) < 5;
18.求学生学号,姓名及其选修课程的课程ID和成绩
18.1.USING子句
- 使用
USING的情况:
-
列名完全相同
-
只需要简单连接
-
想要简洁的代码
SELECT StudentId,Name,CourseId,Score
FROM Student
JOIN Grades
USING (StudentId);
18.2.ON子句
- 使用
ON的情况:
-
需要明确的连接条件
-
列名不完全相同
-
需要复杂的连接条件
SELECT StudentId,Name,CourseId,Score
FROM Student
JOIN Grades
ON student.StudentId= Grades.StudentId;
18.3.表列名和ON子句
- 使用
表别名+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子句
- 使用
NATURAL JOIN的情况:
-
两个表有多个相同列
-
需要自动匹配所有相同列
-
想要最简单的代码
SELECT StudentId,Name,CourseId,Score
FROM Student
NATURAL JOIN Grades;
在实际应用中,表别名+ON 的方式最常用,因为它最灵活且最清晰。
19.查询课程号为‘001’且成绩在70以下或成绩在90以上的学生姓名,课程名和成绩
SELECT部分:
-
s.Name:学生姓名
-
c.Name:课程名称
-
g.Score:成绩
JOIN和USING部分:
-
JOIN Grades g USING (StudentId):通过
StudentId连接Student和Grades表 -
JOIN Course c USING (CourseId):通过
CourseId连接Grades和Course表 -
注意:USING 子句中的列名要用括号括起来
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:限制输出的行数)
SELECT部分:
-
s.StudentId:学生学号
-
s.Name:学生姓名
-
c.CourseId:课程编号
-
g.Score:成绩
JOIN和USING部分:
-
JOIN Grades g USING (StudentId):通过
StudentId连接Student和Grades表 -
JOIN Course c USING (CourseId):通过
CourseId连接Grades和Course表 -
注意:USING 子句中的列名要用括号括起来
WHERE部分:
- c.Name = '数据分析':筛选课程名为"数据分析"的记录
ORDER BY部分:
- g.Score DESC:按成绩降序排列
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;