21.分别用嵌套查询和连接查询:查询学习课程号为001的学生学号与姓名
21.1嵌套查询
SELECT部分:
-
StudentId:学生学号
-
s.Name:学生姓名
FROM部分:
- Student s:从学生表查询,使用别名 s
WHERE部分:
-
StudentId
IN(...):使用子查询筛选学生ID -
子查询:从 Grades 表中找出所有选修了课程号为 '001' 的学生ID
SELECT StudentId,s.Name
FROM Studet s
WHERE StudentId IN(
SELECT StudentId
FROM Grades
WHERE CourseId = '001'
);
21.2连接查询
SELECT部分:
-
s.StudentId:学生学号
-
s.Name:学生姓名
FROM和JOIN部分:
-
FROM Student s:从学生表开始查询,使用别名 s
-
JOIN Grades g USING (StudentId):通过
StudentId连接Student和Grades表 -
注意:
USING 子句中的列名要用括号括起来
WHERE部分:
- g.CourseId = '001':筛选课程号为 '001' 的记录
SELECT StudentId,s.Name
FROM Student s
JOIN Grades g
USING (StudentId)
WHERE g.CourseId = '001';
22.查询选修了课程名为”数据结构“的学生学号和课程号,成绩
SELECT部分:
-
s.StudentId:学生学号(来自Student表)
-
g.CourseId:课程编号(来自Grades表)
-
g.Score:成绩(来自Grades表)
FROM和JOIN部分:
-
FROM Student s:从学生表开始查询,使用别名 s
-
JOIN Grades g USING (StudentId):通过
StudentId连接Student和Grades表 -
JOIN Course c USING (CourseId):通过
CourseId连接Grades和Course表 -
注意:USING 子句中的列名要用括号括起来
WHERE部分:
- c.Name = '数据结构':筛选课程名为"数据结构"的记录
SELECT s.StudentId,c.CourseId,s.Score
FROM Student s
JOIN Grades g
USING (StudentId)
JOIN Course c
USING (CourseId)
WHERE c.Name = '数据结构'
23.查询和李明年龄相同的学生的姓名和系
SELECT部分:
-
s.Name:学生姓名
-
s.Department:学生所在系
FROM部分:
- FROM Student s:从学生表查询,使用别名 s
WHERE部分:
-
子查询:(SELECT Age FROM Student s WHERE s.Name = '李明'):找出李明的年龄 -
s.Age = (...):筛选出年龄与李明相同的学生 -
ANDs.Name<>'李明`:排除李明自己
SELECT s.Name,s.Department
FROM Student s
WHERE s.Age = (
SELECT Age
FROM Student s
WHERE s.name = '李明')
AND s.Name <> '李明';
24.查询比学号为"2023001"的课程号为"001"成绩高的所有学生的学号和成绩
SELECT部分:
-
g.StudentId:学生学号
-
g.Score:成绩
FROM部分:
- FROM Grades g:从成绩表查询,使用别名 g
WHERE部分:
-
子查询:(SELECT Score FROM Grades WHERE StudentId = '2023001' AND CourseId = '001'):找出学号为"2023001"的学生在课程"001"中的成绩 -
g.Score > (...):筛选出成绩比这个分数高的记录 -
ANDg.StudentId<>'2023001':排除学号为"2023001"的学生自己
SELECT g.StudentId,g.Score
FROM Grades g
WHERE g.Score > (
SELECT Score
FROM Grades
WHERE StudentId = '2023001'
AND CourseId = '001')
AND g.StudentId <> '2023001';
25.查询其他系比cs系中某一个学生年纪大的学生的姓名和系,年龄
SELECT部分:
-
s.Name:学生姓名
-
s.Department:学生所在系
-
s.Age:学生年龄
FROM部分:
- FROM Student s:从学生表查询,使用别名 s
WHERE部分:
-
s.Age >
ANY(...):年龄大于CS系中任意一个学生的年龄 -
子查询:(SELECTAgeFROMStudentWHEREDepartment = 'CS'):找出CS系所有学生的年龄 -
ANDs.Department<>'CS':筛选非CS系的学生
SELECT s.Name,s.Department,s.Age
FROM Student s
WHERE s.Age > ANY(
SELECT Age
FROM Student
WHERE Department = 'CS')
AND s.Department <> 'CS';
26.查询比cs系所有学生年纪大的学生的姓名和系,年龄
SELECT部分:
-
s.Name:学生姓名
-
s.Department:学生所在系
-
s.Age:学生年龄
FROM部分:
- FROM Student s:从学生表查询,使用别名 s
WHERE部分:
-
s.Age > ALL (...):年龄大于CS系所有学生的年龄
-
子查询:(
SELECTAgeFROMStudentWHEREDepartment = 'CS'):找出CS系所有学生的年龄 -
ANDs.Department<>'CS':筛选非CS系的学生
SELECT s.Name,s.Department,s.Age
FROM Student s
WHERE s.Age > ALL(
SELECT Age
FROM Student
WHERE Department = 'CS')
AND s.Department <> 'CS';
27.查询与”张三“同系且同龄的学生的姓名和院系
SELECT部分:
-
s.Name:学生姓名
-
s.Department:学生所在系
FROM部分:
- FROM Student s:从学生表查询,使用别名 s
WHERE部分:
-
第一个子查询:(
SELECTDepartmentFROMStudentWHEREName = '张三'):找出张三的系 -
第二个子查询:(
SELECTAgeFROMStudentWHEREName = '张三'):找出张三的年龄 -
ANDs.Name<>'张三':排除张三自己
SELECT s.Name,s.Department
FROM Student s
WHERE s.Department = (
SELECT Department
FROM Student
WHERE Name = '张三'
)
AND s.Age = (
SELECT Age
FROM Student
WHERE Name = '张三'
)
AND s.Name <> '张三';
28.查询年龄大于女同学平均年龄的男同学的姓名和年龄
SELECT部分:
-
s.Name:学生姓名
-
s.Age:学生年龄
FROM部分:
- FROM Student s:从学生表查询,使用别名 s
WHERE部分:
-
子查询:(
SELECTAVG(Age)FROMStudentWHEREGender = '女'):计算女同学的平均年龄 -
s.Age > (...):筛选出年龄大于女同学平均年龄的学生
-
ANDs.Gender = '男':只选择男同学
SELECT s.Name,s.Age
FROM Student s
WHERE s.Age >(
SELECT AVG(Age)
FROM Student
WHERE Gender = '女'
)
AND s.Gender = '男'
29.查询选修了”数据结构“课程且成绩在90以上的学生学号与成绩
SELECT部分:
-
g.StudentId:学生学号
-
g.Score:成绩
FROM和JOIN部分:
-
FROMGrades g:从成绩表开始查询,使用别名 g -
JOINCourse cUSING(CourseId):通过 CourseId 连接成绩表和课程表 -
注意:USING 子句中的列名要用括号括起来
WHERE部分:
-
g.Score > 90:筛选成绩大于90的记录
-
ANDc.Name = '数据结构':筛选课程名为"数据结构"的记录
SELECT g.StudentId,g.Score
FROM Grades g
JOIN Course c
USING (CourseId)
WHERE c.Name = '数据结构'
AND g.Score > 90;
30.查询选修了001号课程且成绩在80-90之间学生的学号,姓名,成绩,并将成绩乘以系数0.85
SELECT部分:
-
s.StudentId:学生学号
-
s.Name:学生姓名
-
g.Score * 0.85:成绩乘以0.85
FROM和JOIN部分:
-
FROMStudent s:从学生表开始查询,使用别名 s -
JOINGrades gUSING(StudentId):通过 StudentId 连接学生表和成绩表 -
注意:USING 子句中的列名要用括号括起来
WHERE部分:
-
g.CourseId = '001':筛选课程号为"001"的记录
-
ANDg.Score >= 80ANDg.Score <= 90:筛选成绩在80到90之间的记录
SELECT s.StudentId,s.Name,g.score * 0.85
FROM Student s
JOIN Grades g
USING (StudentId)
WHERE g.CourseID = '001'
AND g.Score >= 80
AND g.Score <= 90;