Mysql 查询以获取一个表中存在但另一个表中不存在的记录

Mysql 查询以获取一个表中存在但另一个表中不存在的记录,mysql,sql,left-join,exists,Mysql,Sql,Left Join,Exists,我有两张桌子: 老师和老师。 这些表格都有“教师电子邮件”列 我需要的是得到那些存在于教师邮箱中但不存在于教师邮箱中的电子邮件 我有两种不同的方法来解决这个问题,但我不明白为什么其中一种不给出任何结果,而另一种返回很多行 第一排:842排 SELECT DISTINCT lm.teacher_email FROM teacher_lm as lm WHERE NOT EXISTS (SELECT * FROM teacher as lt WHERE lt

我有两张桌子: 老师和老师。 这些表格都有“教师电子邮件”列

我需要的是得到那些存在于教师邮箱中但不存在于教师邮箱中的电子邮件

我有两种不同的方法来解决这个问题,但我不明白为什么其中一种不给出任何结果,而另一种返回很多行

第一排:842排

SELECT   DISTINCT lm.teacher_email
FROM       teacher_lm as lm
WHERE      NOT EXISTS (SELECT  * FROM teacher as lt
       WHERE lt.teacher_email = lm.teacher_email         
      )
第二个:没有结果

SELECT DISTINCT lm.teacher_email FROM
teacher_lm AS lm
WHERE lm.teacher_email NOT IN
(SELECT lt.teacher_email FROM 
teacher AS lt)
你能告诉我我做错了什么吗?最好的方法是什么

谢谢。

子查询“in”中可能有空值

请尝试以下方法:

SELECT DISTINCT lm.teacher_email
FROM teacher_lm AS lm
WHERE lm.teacher_email NOT IN (SELECT coalesce(lt.teacher_email, '')
                               FROM  teacher AS lt) 

顺便说一句,出于优化的考虑,我认为第一个版本是mysql推荐的版本。

您的第一个查询正在处理是否存在整行

第二个查询可能返回空值。我认为NOT IN子句在出现空值时不起作用


Gordon的答案纠正了这一点,用空字符串替换空字符串。

谢谢!!你是对的:)现在它给出了相同数量的结果。IN子查询的完成时间比EXIST子查询长很多年,所以我选择这个子查询。再次感谢:)@Vika。以防您使用其他数据库,EXISTS优于in的特性是mysql特有的。在其他数据库中可能是真的,也可能不是真的,但其他数据库引擎在中优化,而不是在更好的中优化。