SQL - EXISTS和NOT EXISTS with notquality

时间:2014-12-19 00:40:22

标签: mysql sql database select exists

Considerf having the following tabes

考虑使用这两个表和以下查询:

SELECT Product. *
FROM Product
WHERE EXISTS 
       ( SELECT *
         FROM Codes
         WHERE  Product.P_code <> Codes.P_code)

SELECT Product. *
FROM Product
WHERE NOT EXISTS 
       ( SELECT *
         FROM Codes
         WHERE  Product.P_code <> Codes.P_code)

以下推理是否正确?

1.第一个查询将生成两个条目,因为代码中有两个与Product中的P_code行不同的P_code行。  2.子查询将返回两个条目,但它们将被主查询中的NOT条件消除,它将返回零行。

我不确定这些查询中的推理是如何工作的。我可以很容易地预测查询何时会打印出2行或3行,但我不知道它在打印0行或5行的情况下是如何工作的(取决于EXISTS / NOT EXISTS条件和相等/不等号) 。

有人可以详细说明这个或给我一个好的阅读吗?谢谢!

2 个答案:

答案 0 :(得分:2)

你的推理不正确。但是,这很容易验证,因此您应该自己运行查询。

第一个查询将返回Product中的所有行。为什么?因为对于每个代码,Codes中至少有一行不等式为真。例如,代码'P_01''P_03'不匹配,因此存在不匹配的代码。

第二个查询将不会在Product中返回任何行。为什么?因为每个产品代码都有不匹配的代码。由于此类代码存在,not exists失败。

我建议你在existsnot exists陈述中坚持平等条件。逻辑更易于遵循,不易出错。

答案 1 :(得分:1)

如果内部查询返回至少一条记录,则EXISTS返回TRUE。

因此,在第一次查询中,EXISTS对所有产品都返回TRUE,因为CODES中至少有一条记录与PRODUCT中的产品代码不匹配。

下面给出的简单可视化。

enter image description here

相反,如果没有从内部查询返回的行,则NO EXISTS返回TRUE。上面的例子没有这种情况,也没有返回。

来自oracle

的参考资料