Student(sno,sname,ssex,sage,clno); Course(cno,cname,credit); Class(clno,speciality,inyear,number,monitor); Grade(sno,cno,gmark);查询所有课程的选修学生人数,若没人选,则显示为0
时间: 2023-12-03 10:46:39 浏览: 61
可以使用左联接(left join)和聚合函数(count)来实现该查询:
```
SELECT Course.cname, COUNT(Grade.sno) AS student_num
FROM Course LEFT JOIN Grade ON Course.cno = Grade.cno
GROUP BY Course.cname;
```
解释一下这个查询语句:
- 首先从 Course 表中选择课程名称(cname);
- 然后使用左联接将 Course 表与 Grade 表连接,连接条件为 Course 表的课程编号(cno)等于 Grade 表的课程编号;
- 使用 COUNT 函数统计 Grade 表中每个课程编号对应的选课学生人数,即学生表中每个课程编号出现的次数;
- 最后按照课程名称(cname)进行分组,以显示每个课程的选修学生人数。
如果一个课程没有学生选修,那么在 Grade 表中就不存在该课程编号对应的记录,左联接会返回该课程的信息以及一个空的 Grade 表记录集,COUNT 函数会将空记录集排除在外并返回 0 作为选修学生人数。
相关问题
STUDENT表有 sno sname ssex sage sdept,couse 有cno cname credit semester,sc有sno cno gradr,请使用SQL语句完成查询选修了生物信息学课程且成绩高于该门课程平均分数的学生的姓名。
SELECT s.sname
FROM student s, sc, couse c
WHERE s.sno = sc.sno
AND sc.cno = c.cno
AND c.cname = '生物信息学'
AND sc.grade > (
SELECT AVG(sc.grade)
FROM sc, couse
WHERE sc.cno = couse.cno
AND couse.cname = '生物信息学'
)
```
Student(sno,sname,ssex,sage,clno); Course(cno,cname,credit); Class(clno,speciality,inyear,number,monitor); Grade(sno,cno,gmark); 查询选3学分的课最多的学生的学号、姓名和课程数
可以使用以下 SQL 语句来实现:
```sql
SELECT s.sno, s.sname, COUNT(*) AS course_count
FROM Student s, Course c, Grade g
WHERE s.sno = g.sno AND c.cno = g.cno AND c.credit = 3
GROUP BY s.sno, s.sname
HAVING COUNT(*) = (
SELECT MAX(count_)
FROM (
SELECT COUNT(*) AS count_
FROM Student s, Course c, Grade g
WHERE s.sno = g.sno AND c.cno = g.cno AND c.credit = 3
GROUP BY s.sno
) t
)
```
该语句通过连接三个表 Student、Course 和 Grade,筛选出选课学分为 3 的成绩记录,再按学号和姓名分组统计每位学生选了多少门 3 学分的课程。最后,通过子查询找出选课门数最多的学生,并返回其学号、姓名和课程数。