如何在MySQL中查询无学员报名的课程名称
查询无学员报名的课程名称
这里有几种常用的SQL写法可以实现你的需求,我会逐一说明(先假设你的第二张学员报名表名为tbl_student_enrollment,如果实际表名不同,替换成对应名称即可;另外你提到的student id字段应该是student_id吧?如果实际字段带空格,记得用反引号包裹,比如`student id`):
方法一:左连接(LEFT JOIN)+ 空值判断
左连接会保留课程表的所有记录,关联报名表后,无报名记录的课程对应的报名字段会是NULL,我们筛选这些记录即可:
SELECT c.course_name FROM tbl_course c LEFT JOIN tbl_student_enrollment se ON c.id = se.course_id WHERE se.course_id IS NULL;
解释:LEFT JOIN确保tbl_course的每一行都被包含,哪怕在报名表中没有匹配的course_id。WHERE se.course_id IS NULL精准筛选出没有任何学员报名的课程。
方法二:NOT EXISTS子查询
这种写法逻辑更直观,检查每一门课程是否不存在对应的报名记录:
SELECT c.course_name FROM tbl_course c WHERE NOT EXISTS ( SELECT 1 FROM tbl_student_enrollment se WHERE se.course_id = c.id );
解释:子查询会针对每门课程验证是否有学员报名,如果子查询返回空(即无报名记录),NOT EXISTS就会选中这门课程。
方法三:NOT IN子查询
注意:如果报名表的course_id存在NULL值,NOT IN会返回空结果,所以使用前要确保course_id无NULL:
SELECT course_name FROM tbl_course WHERE id NOT IN ( SELECT DISTINCT course_id FROM tbl_student_enrollment WHERE course_id IS NOT NULL -- 避免NULL干扰结果 );
解释:先从报名表中提取所有有学员报名的课程ID(去重),再筛选出课程表中不在这个列表里的课程名称。
内容的提问来源于stack exchange,提问作者user3056158
相关产品推荐
相关产品推荐

