postgresQL中NOT IN和NOT EXISTS之间的区别

时间:2014-01-29 09:14:15

标签: sql postgresql

这是我的桌子 info.student_info table

当我使用NOT IN执行以下查询时,它给了我namal和Ann。

SELECT firstname 
FROM info.student_info 
WHERE firstname NOT IN (SELECT firstname 
                        FROM info.student_info 
                        WHERE lastname IS NULL)

但是当我使用NOT EXISTS执行以下查询时,它没有给我任何行。

SELECT firstname 
FROM info.student_info 
WHERE NOT EXISTS (SELECT firstname 
                  FROM info.student_info 
                  WHERE lastname IS NULL)

这是为什么?我已经研究了NOT IN和NOT EXISTS的一些领域,但未能找到答案。

3 个答案:

答案 0 :(得分:11)

当值不在子查询返回的集合中时,

NOT IN为true。 当子查询没有返回任何内容时,NOT EXISTS为真。

答案 1 :(得分:2)

您尚未加入NOT EXISTS查询中的表格,这就是为什么您没有从第二次查询中获得任何结果。

只有当子查询根本找不到记录时,您的第二个查询才会返回结果。

将您的查询更改为连接到外部表的firstname列,然后您可能会得到结果。

SELECT firstname
FROM info.student_info
WHERE NOT EXISTS (SELECT b.firstname
                  FROM   info.firstname b
                  WHERE  b.lastname IS NULL
                  AND    b.firstname = a.firstname
                 )

免责声明:未测试查询

答案 2 :(得分:1)

您的NOT EXISTS不区分名字,因此子选择将始终返回2行。

要使用NOT EXISTS执行相同的操作,您需要使用以下SQL:

SELECT firstname FROM info.student_info 
WHERE NOT EXISTS 
  (SELECT firstname f2 FROM info.student_info
    WHERE lastname IS NULL 
      AND f2 = firstname)