题目
手写 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 门考试的学生。