MySql查询何处使用2个以上条件

MySql查询何处使用2个以上条件,mysql,aggregate-functions,Mysql,Aggregate Functions,我需要找到所有注册了操作系统设计课程但没有注册数据库系统设计课程的学生的姓名。所以我写了这个查询。这里学生是第一个表,注册的是第二个表,snum是外键 select s.sname from student s, enrolled e where(s.snum=e.snum AND e.cname="Operating System Design" AND e.cname!="Database Systems" ); 它只

我需要找到所有注册了操作系统设计课程但没有注册数据库系统设计课程的学生的姓名。所以我写了这个查询。这里学生是第一个表,注册的是第二个表,snum是外键

select s.sname 
from student s, enrolled e 
where(s.snum=e.snum 
    AND e.cname="Operating System Design" 
    AND e.cname!="Database Systems"
    );

它只是打印在operating sys design中注册的学生的姓名,如果类似的话,它只是检查第一个条件。

您必须正确连接两个表,按学生分组,并在
HAVING
子句中使用条件聚合:

SELECT s.id, s.sname 
FROM student s INNER JOIN enrolled e 
ON s.snum = e.snum  
GROUP BY s.id, s.sname
HAVING MAX(e.cname = 'Operating System Design') = 1
   AND MAX(e.cname = 'Database Systems') = 0
我在
GROUP BY
子句和
SELECT
中使用学生id,以防列
sname
不唯一。
如果它是唯一的,您可以将其删除。

您也可以使用
EXISTS

SELECT s.id, s.sname 
FROM student s 
WHERE EXISTS (SELECT 1 FROM enrolled e WHERE s.snum = e.snum AND e.cname = 'Operating System Design')
AND NOT EXISTS (SELECT 1 FROM enrolled e WHERE s.snum = e.snum AND e.cname = 'Database Systems')

您将需要比多个WHERE条件更复杂的东西。这需要某种形式的子查询或左连接来比较
操作系统设计
结果与单独的
数据库系统
结果谢谢您的解决方案。我只是想问,如果我使用许多条件,我是否每次都必须使用这个Max,或者还有其他方法。@HimanshuKaushik对每个单独的条件使用它一次。为什么select语句中有1,它意味着什么。@HimanshuKaushik 1没有什么特别之处,它可以是0、null或*。如果满足WHERE之后的条件,则返回一个值。如果不满足条件,则不会返回任何内容,存在的内容将为假,或不存在的内容将为真。谢谢您的时间和解决方案: