mysql查询选修了全部课程的学生信息
封面图
•
2025-12-28
•
MySQL
321
0
0
0
在 MySQL 中,要查询**选修了全部课程的学生信息**,需要知道两个表的结构: - 学生表(例如 `student`):包含学生信息,如 `student_id`, `name` 等。 - 选课表(例如 `enroll` 或 `course_enrollment`):记录学生选课情况,如 `student_id`, `course_id`。 同时,还需要知道所有课程的信息,通常在 `course` 表中。 --- ### 假设表结构如下: #### student 表 | student_id | name | |------------|--------| | 1 | 张三 | | 2 | 李四 | #### course 表 | course_id | course_name | |-----------|-------------| | 1 | 数学 | | 2 | 英语 | | 3 | 物理 | #### enroll 表 | student_id | course_id | |------------|-----------| | 1 | 1 | | 1 | 2 | | 1 | 3 | | 2 | 1 | | 2 | 2 | --- ### 目标:找出**选修了所有课程**的学生 可以使用以下 SQL 查询: ```sql SELECT s.student_id, s.name FROM student s WHERE NOT EXISTS ( SELECT 1 FROM course c WHERE NOT EXISTS ( SELECT 1 FROM enroll e WHERE e.student_id = s.student_id AND e.course_id = c.course_id ) ); ``` --- ### 解释: - 外层查询遍历每个学生。 - 内层子查询检查是否有某门课程 **没有被该学生选修**。 - 如果没有这样的课程(即 `NOT EXISTS` 成立),说明该学生选修了所有课程。 --- ### 另一种写法(使用 GROUP BY 和 HAVING): ```sql SELECT e.student_id, s.name FROM enroll e JOIN student s ON e.student_id = s.student_id GROUP BY e.student_id, s.name HAVING COUNT(DISTINCT e.course_id) = (SELECT COUNT(*) FROM course); ``` --- ### 说明: - `COUNT(DISTINCT e.course_id)`:统计该学生选修的不同课程数量。 - `(SELECT COUNT(*) FROM course)`:总共有多少门课程。 - 如果两者相等,说明该学生选修了全部课程。 --- ### 总结: - 使用 `NOT EXISTS` 的方式更直观、逻辑清晰。 - 使用 `GROUP BY + HAVING` 的方式更高效,尤其在数据量大时。 你可以根据实际表结构调整字段名。如果你提供具体的表结构,我可以帮你写更精确的 SQL。
上一篇:
mysql查询本月过生日的学生
下一篇:
mysql查询各学生的年龄
标题录入,一次不能超过6条
留言
评论