统计选课门数时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`:按学生姓名分组,以便统计每个学生的选课门数。