题目
手写 SQL:有学生表和成绩表,请分别查询没考试的学生信息、参加了两门考试的学生
答案
以下是学生表和成绩表的结构和数据:
学生表(students):
| id | name |
| ---- | ------- |
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
| 4 | David |
| 5 | Emily |
| 6 | Frank |
成绩表(scores):
| id | student_id | subject | score |
| ---- | ---------- | ------- | ----- |
| 1 | 1 | math | 90 |
| 2 | 1 | english | 85 |
| 3 | 2 | math | 80 |
| 4 | 2 | english | 70 |
| 5 | 3 | math | 95 |
| 6 | 3 | english | 92 |
| 7 | 3 | science | 88 |
| 8 | 4 | math | 70 |
| 9 | 4 | english | 65 |
### 查询未考试的学生信息
可以使用左连接(LEFT JOIN)查询学生表和成绩表,然后筛选出没有成绩记录的学生即可。以下是示例 SQL:
```sql
SELECT s.*
FROM students s
LEFT JOIN scores sc ON s.id = sc.student_id
WHERE sc.student_id IS NULL;
```
这条 SQL 会查询出所有学生表中的记录,并将它们与成绩表中的记录进行左连接,即包含所有学生表中的记录,同时匹配成绩表中符合条件的记录。最后,筛选出成绩表中没有对应记录的学生即可,也就是 `sc.student_id IS NULL` 的学生记录。
### 查询考了两门考试的学生信息
可以使用 GROUP BY 和 HAVING 子句来查询参加了 2 门考试的学生。具体的 SQL 语句如下:
```sql
SELECT s.name, COUNT(*) AS exam_count
FROM students s
JOIN scores sc ON s.id = sc.student_id
GROUP BY s.id
HAVING COUNT(*) = 2;
```
这条 SQL 语句中,首先使用 JOIN 将学生表和成绩表进行连接,然后使用 GROUP BY 对学生进行分组,统计每个学生参加考试的次数。最后使用 HAVING 过滤出参加 2 门考试的学生。
