考试报名
考试报名
考试内容
考试大纲
在线客服
返回顶部

备考刷题,请到

CDA认证小程序

设数据库中有以下三张表:sc(sno,cno,grade),course(cno,cname,hours),student(sno,sname,ssex,sage,sdept)。试用SQL语言写出以下查询。 统计每个学生的姓名和选课门数
A. SELECT student.sname 学生姓名,COUNT(sc.sno) 选课门数FROM student right join sc ON sc.sno=student.sno GROUP BY student.sname;
B. SELECT student.sname 学生姓名,COUNT(student.sno) 选课门数FROM student left join sc ON sc.sno=student.sno GROUP BY student.sname;
C. SELECT student.sname 学生姓名,COUNT(sc.sno) 选课门数FROM student right join sc ON sc.sno=student.sno ORDER BY student.sname;
D. SELECT student.sname 学生姓名,COUNT(student.sno) 选课门数FROM student left join sc ON sc.sno=student.sno ORDER BY student.sname;
上一题
下一题
收藏
点赞
评论
题目解析
题目评论(6)

统计选课门数时sc应为主表,使用COUNT函数进行计数

正确答案是 B: `SELECT student.sname 学生姓名, COUNT(sc.sno) 选课门数 FROM student LEFT JOIN sc ON sc.sno=student.sno GROUP BY student.sname;`

### 分析:

1. **表结构与需求**:
- `student` 表包含学生的基本信息。
- `sc` 表记录学生选课情况。
- 需求是统计每个学生的姓名和他们选课的门数。

2. **连接方式**:
- `LEFT JOIN`:返回左表(`student`)的所有记录,以及右表(`sc`)中满足连接条件的记录。如果右表中没有匹配的记录,则结果中包含左表的记录,并且右表的字段为NULL。
- `RIGHT JOIN`:返回右表(`sc`)的所有记录,以及左表(`student`)中满足连接条件的记录。如果左表中没有匹配的记录,则结果中包含右表的记录,并且左表的字段为NULL。

3. **选项分析**:
- **A**: 使用 `RIGHT JOIN`,统计的是 `sc` 表中的记录,但我们需要统计每个学生的选课门数,这种方式可能导致结果不准确。
- **B**: 使用 `LEFT JOIN`,从 `student` 表出发,统计每个学生的选课门数,并且使用 `GROUP BY` 按学生姓名进行分组,这是最合适的。
- **C**: 使用 `RIGHT JOIN`,但没有 `GROUP BY`,只使用 `ORDER BY`,会导致统计结果不正确。
- **D**: 使用 `LEFT JOIN`,但统计的是 `student.sno` 的数量,而不是 `sc.sno`,这会导致统计结果不正确。

### 正确的 SQL 语句解释:
```sql
SELECT student.sname 学生姓名, COUNT(sc.sno) 选课门数
FROM student
LEFT JOIN sc ON sc.sno = student.sno
GROUP BY student.sname;
```
- `SELECT student.sname, COUNT(sc.sno)`:选择学生姓名,并统计选课门数。
- `FROM student LEFT JOIN sc ON sc.sno = student.sno`:从 `student` 表出发,左连接 `sc` 表,确保每个学生都被包括在结果中,即使他们没有选课。
- `GROUP BY student.sname`:按学生姓名分组,以便统计每个学生的选课门数。

用户107250
如有有学生没有选课,那么A的统计结果是错误的,选B没问题吧
用户124592
呃,应该数cno吧
用户122831
应该选啥呀
用户114279
解析里的B选项count的不一样
用户112860
答案不对
用户57311
?????答案和解析不一致啊