我有 2 个简单的表:students(sno,sname,age)
和take(sno,cno)
. Take
是N-N
学生和课程之间的关系表。
我想找到没有参加特定课程的学生。
以下查询可以完成这项工作,但我不清楚它是如何工作的:
SELECT s.sno,s.sname,s.age
FROM students s LEFT JOIN take t
ON (s.sno = t.sno)
GROUP BY s.sno,s.sname,s.age
HAVING MAX(CASE WHEN t.cno = 'CS112' THEN 1 ELSE 0 END) = 0;
它与MAX
ANDHAVING
的处理顺序有关吗?
一个简单的方法是使用子查询:
SELECT * FROM students
WHERE sno NOT IN
(SELECT sno FROM take WHERE cno = 'CS112');
但我有兴趣了解使用的版本JOIN