如何在学生数据库中筛选仅选修数学未选修科学的学生rollno
仅选修数学课程的学生学号筛选方案
以下是几种可行的SQL解决方案,可精准筛选出只选修数学、未选修科学的学生学号:
方法1:使用NOT EXISTS子查询
通过子查询校验学生是否存在选修科学的记录,仅保留无该记录的数学选课学生:
SELECT rollno FROM student s1 WHERE course = 'maths' AND NOT EXISTS ( SELECT 1 FROM student s2 WHERE s2.rollno = s1.rollno AND s2.course = 'science' );
方法2:LEFT JOIN 排除匹配记录
将学生表自连接匹配科学选课记录,筛选连接后无科学选课匹配的数学选课学生(加DISTINCT避免重复学号):
SELECT DISTINCT s1.rollno FROM student s1 LEFT JOIN student s2 ON s1.rollno = s2.rollno AND s2.course = 'science' WHERE s1.course = 'maths' AND s2.rollno IS NULL;
方法3:使用NOT IN子查询
先获取所有选修科学的学生学号,再从数学选课学生中排除这些学号:
SELECT rollno FROM student WHERE course = 'maths' AND rollno NOT IN ( SELECT rollno FROM student WHERE course = 'science' );
⚠️ 注意:如果student表中rollno存在NULL值,NOT IN可能返回异常结果,此时优先选择NOT EXISTS方案。
方法4:分组后筛选课程条件
按学号分组,校验该学生仅选修了数学课程:
SELECT rollno FROM student GROUP BY rollno HAVING SUM(CASE WHEN course = 'science' THEN 1 ELSE 0 END) = 0 AND SUM(CASE WHEN course = 'maths' THEN 1 ELSE 0 END) > 0;
内容的提问来源于stack exchange,提问作者adesh singh
相关产品推荐
相关产品推荐

