它的EXISTS功能有点令人困惑?

时间:2017-04-13 20:29:12

标签: sql

我有2张桌子

  • t1(col),其值为(1),(2)
  • t2(col),其值为(1)

此查询:

SELECT * 
FROM t1 
WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.col >= 2)

t1返回两行,这没关系,因为EXISTS至少返回一行,所以where子句变为TRUE。

现在是第二个查询

SELECT * 
FROM t1 
WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.col = t2.col)

这只返回1行。为什么?在这种情况下EXISTS也会返回至少一行,那么为什么不从“t1”表返回所有行?

EXISTS()功能如何真正起作用?

2 个答案:

答案 0 :(得分:2)

在您的第一个查询中,exists()内没有对外部表的引用,并且由于该查询的计算结果为true,因此查询将变为

select * from t1 where 1 = 1 ;

您的第二个查询确实引用了exists()中的外部表,并针对t1.col的每个值进行了评估。因此,对于t1.col = 1 exists() true返回t1.col = 2的行,当exists()时,t1.col = 1返回false。因此,您的结果集只包含{{1}}的行。

答案 1 :(得分:0)

如果EXISTS找到一条或多条记录,则返回true。 由于列t1的值为1和2,t2的值为1。

这个

SELECT * 
FROM t1 
WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.col = t2.col)  

现在意味着

SELECT * 
FROM t1 
WHERE EXISTS (SELECT 1 FROM t2 WHERE 1 = 1)

所以你只得到1行而不是2行。