现有2张表
course
course_id int 课程ID
score float 课程得分,满分100,60及格
student_id int 学生ID
student
student_id int 学生ID
name string 学生姓名
一个学生可能有多个课程得分(即student一对多于course)
现定义一个学生及格的条件为所有课程中只要有一门课程及格则算及格,只有所有课程不及格的情况下才算不及格
求所有及格的学生和所有不及格的学生。
及格很简单
SELECT
s.student_id,
s.name
FROM
student s
INNER JOIN
course c
ON
s.student_id = c.student_id
WHERE
c.score >= 60
GROUP BY
student_id
但是不及格却不能直接以 WHERE c.score < 60 GROUP BY student_id
得出结果
问除了使用NOT IN及格的学生的结果 还有什么比较好的方法?
注意:此处只是模拟真实场景,实际上的条件比score >= 60
要多,所以不应该特别针对此处使用MIN
来做...(如果回复有我会再说明的)
我有个思路,
1、在课程表中查出分数小于60对应的学生id
2、再去课程表查该学生id下是否有课程大于60
3、如果不存在,根据id查出学生信息
这里可以用三种方式来实现:
1、逐句逐句来查。优点:思路清晰,不容易出错。
2、用In/Not In来做子查询
3、用mysql中的where exists/not exists来优化IN/NOT IN
我试着用方法3来写一下:
(我本地跑了一下,没有问题)
对于exists于in的效率,可以去自己搜搜看。
这类问题可以划分到:除了满足一个条件,还需满足另外的条件这种情景上。以后遇到这种问题,可以直接往里套。
ps:
1、student表里的name为什么是int类型。。。
2、我最先以为你写的及格sql是错的,跑了下竟然可以。
涨知识:mysql中聚合函数可以查其他字段,而在oracle中不可以。