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

60 阅读5分钟

21.分别用嵌套查询和连接查询:查询学习课程号为001的学生学号与姓名

21.1嵌套查询

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

  • s.Name:学生姓名

  1. FROM 部分:
  • Student s:从学生表查询,使用别名 s
  1. 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连接查询

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

  • s.Name:学生姓名

  1. FROMJOIN 部分:
  • FROM Student s:从学生表开始查询,使用别名 s

  • JOIN Grades g USING (StudentId):通过 StudentId 连接 StudentGrades

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

  1. WHERE部分:
  • g.CourseId = '001':筛选课程号为 '001' 的记录
SELECT StudentId,s.Name
FROM Student s
JOIN Grades g
USING (StudentId)
WHERE g.CourseId = '001';

22.查询选修了课程名为”数据结构“的学生学号和课程号,成绩

  1. SELECT 部分:
  • s.StudentId:学生学号(来自Student表)

  • g.CourseId:课程编号(来自Grades表)

  • g.Score:成绩(来自Grades表)

  1. FROMJOIN部分:
  • FROM Student s:从学生表开始查询,使用别名 s

  • JOIN Grades g USING (StudentId):通过 StudentId 连接 StudentGrades

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

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

  1. 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.查询和李明年龄相同的学生的姓名和系

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

  • s.Department:学生所在系

  1. FROM 部分:
  • FROM Student s:从学生表查询,使用别名 s
  1. WHERE 部分:
  • 子查询:(SELECT Age FROM Student s WHERE s.Name = '李明'):找出李明的年龄

  • s.Age = (...):筛选出年龄与李明相同的学生

  • AND s.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"成绩高的所有学生的学号和成绩

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

  • g.Score:成绩

  1. FROM 部分:
  • FROM Grades g:从成绩表查询,使用别名 g
  1. WHERE 部分:
  • 子查询:(SELECT Score FROM Grades WHERE StudentId = '2023001' AND CourseId = '001'):找出学号为"2023001"的学生在课程"001"中的成绩

  • g.Score > (...):筛选出成绩比这个分数高的记录

  • AND g.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系中某一个学生年纪大的学生的姓名和系,年龄

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

  • s.Department:学生所在系

  • s.Age:学生年龄

  1. FROM 部分:
  • FROM Student s:从学生表查询,使用别名 s
  1. WHERE 部分:
  • s.Age > ANY (...):年龄大于CS系中任意一个学生的年龄

  • 子查询:(SELECT Age FROM Student WHERE Department = 'CS'):找出CS系所有学生的年龄

  • AND s.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系所有学生年纪大的学生的姓名和系,年龄

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

  • s.Department:学生所在系

  • s.Age:学生年龄

  1. FROM 部分:
  • FROM Student s:从学生表查询,使用别名 s
  1. WHERE 部分:
  • s.Age > ALL (...):年龄大于CS系所有学生的年龄

  • 子查询:(SELECT Age FROM Student WHERE Department = 'CS'):找出CS系所有学生的年龄

  • AND s.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.查询与”张三“同系且同龄的学生的姓名和院系

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

  • s.Department:学生所在系

  1. FROM 部分:
  • FROM Student s:从学生表查询,使用别名 s
  1. WHERE 部分:
  • 第一个子查询:(SELECT Department FROM Student WHERE Name = '张三'):找出张三的系

  • 第二个子查询:(SELECT Age FROM Student WHERE Name = '张三'):找出张三的年龄

  • AND s.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.查询年龄大于女同学平均年龄的男同学的姓名和年龄

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

  • s.Age:学生年龄

  1. FROM 部分:
  • FROM Student s:从学生表查询,使用别名 s
  1. WHERE 部分:
  • 子查询:(SELECT AVG(Age) FROM Student WHERE Gender = '女'):计算女同学的平均年龄

  • s.Age > (...):筛选出年龄大于女同学平均年龄的学生

  • AND s.Gender = '男':只选择男同学

SELECT s.Name,s.Age
FROM Student s
WHERE s.Age >(
    SELECT AVG(Age)
    FROM Student
    WHERE Gender = '女'
)
AND s.Gender = '男'

29.查询选修了”数据结构“课程且成绩在90以上的学生学号与成绩

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

  • g.Score:成绩

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

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

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

  1. WHERE 部分:
  • g.Score > 90:筛选成绩大于90的记录

  • AND c.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

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

  • s.Name:学生姓名

  • g.Score * 0.85:成绩乘以0.85

  1. FROMJOIN 部分:
  • FROM Student s:从学生表开始查询,使用别名 s

  • JOIN Grades g USING (StudentId):通过 StudentId 连接学生表和成绩表

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

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

  • AND g.Score >= 80 AND g.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;