有一个[学生课程]数据库Stu_Cou,该数据库中包含三个表: 学生表: Student(Sno,Sname,Ssex,Sbirth,Spre,Sclass,Sdept) ,Sno 为关键字。 表示由学号(Sno)、姓名(Sname)、性别(Ssex)、出生日期(Sbirth)、已修学分(Spre)、班级(Sclass)、所在系(Sdept)七个属性,其中Sno为主码。 课程表Course由课程号(Cno)、课程名(Cname)、课程类型(Ctype)、先修课号(Cpno)、学分(Ccredit)五个个属性组成,记为:Course(Cno,Cname,Ctype,Cpno,Ccredit) ,Cno为主码。 学生选课表SC由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,记为: SC(Sno,Cno,Grade) (Sno, Cno)为主码。 要求用SQL语句完成:查询学号为‘20230001’的学生选修而学号为‘20230002’的学生没有选修的课程号。
时间: 2024-03-24 12:38:35 浏览: 103
可以使用左连接查询和子查询来实现:
```
SELECT course.Cno
FROM Course course
LEFT JOIN SC sc1 ON course.Cno = sc1.Cno AND sc1.Sno = '20230001'
LEFT JOIN SC sc2 ON course.Cno = sc2.Cno AND sc2.Sno = '20230002'
WHERE sc1.Sno IS NOT NULL AND sc2.Sno IS NULL;
```
解释一下这个 SQL 查询:
- 首先从课程表 Course 开始,使用左连接查询与 SC 表连接,连接条件是 Course 表中的 Cno 字段等于 SC 表中的 Cno 字段。
- 同时再连接 SC 表和学生表 Student,以获取学生的学号和姓名等信息。
- 在连接 SC 表时,使用了两个 SC 表的别名 sc1 和 sc2,分别代表学号为 ‘20230001’ 和 ‘20230002’ 的学生。
- 在 WHERE 子句中,使用 IS NOT NULL 过滤出学号为 ‘20230001’ 的学生已经选修的课程,同时使用 IS NULL 过滤出学号为 ‘20230002’ 的学生没有选修的课程。
- 最后,只返回课程号 Cno 列。
相关问题
有一个[学生课程]数据库Stu_Cou,该数据库中包含三个表: 学生表: Student(Sno,Sname,Ssex,Sbirth,Spre,Sclass,Sdept) ,Sno 为关键字。 表示由学号(Sno)、姓名(Sname)、性别(Ssex)、出生日期(Sbirth)、已修学分(Spre)、班级(Sclass)、所在系(Sdept)七个属性,其中Sno为主码。 课程表Course由课程号(Cno)、课程名(Cname)、课程类型(Ctype)、先修课号(Cpno)、学分(Ccredit)五个个属性组成,记为:Course(Cno,Cname,Ctype,Cpno,Ccredit) ,Cno为主码。 学生选课表SC由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,记为: SC(Sno,Cno,Grade) (Sno, Cno)为主码。 要求用SQL语句完成:查询选修全部课程的学生姓名和学号。
可以使用以下 SQL 语句查询选修全部课程的学生姓名和学号:
```
SELECT Student.Sno, Student.Sname
FROM Student
WHERE NOT EXISTS (
SELECT *
FROM Course
WHERE NOT EXISTS (
SELECT *
FROM SC
WHERE SC.Sno = Student.Sno AND SC.Cno = Course.Cno
)
);
```
这条语句中,首先在 `Student` 表中选择出所有学生的学号和姓名,然后使用子查询判断该学生是否选修了全部课程。如果该学生存在一门课程未选修,那么这个子查询返回值不为空,那么该学生就不符合要求。最后返回符合要求的学生的学号和姓名。
用MySQL写一篇关于 2、现有学生,课程,成绩三张表。 student(学生表):stu_id:学生id,stu_name:学生姓名,birthday:学生出生日期,stu_sex:学生性别。 course(课程表):cou_id:课程id,cou_name:课程名字。 grades(成绩表):stu_id:学生id,cou_id:课程id;score:成绩。 学生表student 课程表course 成绩表grades (1)查询名字中含有“云”字的学生信息。要求:写出查询的字段名。 (2)查询每门课的最高成绩、最低成绩、平均成绩。要求:查询结果列表名分别为课程、最高成绩、最低成绩、平均成绩。
好的,您的问题我已经接收到了。以下是您所需要的MySQL代码:
(1) 查询名字中含有“云”字的学生信息,字段名为:学生id、学生姓名、学生出生日期、学生性别。
```sql
SELECT stu_id, stu_name, birthday, stu_sex
FROM student
WHERE stu_name LIKE '%云%';
```
(2) 查询每门课的最高成绩、最低成绩、平均成绩,查询结果列表名分别为:课程、最高成绩、最低成绩、平均成绩。
```sql
SELECT cou_name AS 课程, MAX(score) AS 最高成绩, MIN(score) AS 最低成绩, AVG(score) AS 平均成绩
FROM course
INNER JOIN grades ON course.cou_id = grades.cou_id
GROUP BY cou_name;
```
希望以上MySQL代码能够解决您的问题,如有疑问请随时追问。
阅读全文