帮助理解SQL语句

时间:2011-05-25 21:23:03

标签: mysql sql

我在以下SQL语句中理解SELECT * FROM myTable WHERE 0 = ...有困难。

SELECT * FROM myTable WHERE 0 = (SELECT COUNT(*) FROM incTable 
WHERE myTable.export_date <= incTable.export_date 
AND myTable.colA = incTable.colA 
AND myTable.colB = incTable.colB 
AND myTable.colC = incTable.colC)

根据我的理解,通常在WHERE子句中,将针对某个其他实体(即另一个列或值)评估列。对两个数字进行评估意味着什么(即WHERE 0 = 5)?无论上述SQL语句中SELECT * FROM myTable子句的结果如何,myTable总是会返回WHERE的内容吗?

5 个答案:

答案 0 :(得分:4)

对于“所有”行,

0 = 5将为false,因此不会返回任何内容。如果子查询没有返回任何行,您将获得myTable中的所有行。

这是做EXISTS()的一种奇怪方式。

答案 1 :(得分:2)

你的想法太难了。括号中的整个select语句可以移动到等号的另一侧,它仍然可以工作......

它可以很容易地写成

SELECT * FROM myTable 
WHERE  (
        SELECT COUNT(*) FROM incTable WHERE myTable.export_date <= incTable.export_date 
        AND myTable.colA = incTable.colA AND myTable.colB = incTable.colB AND myTable.colC =
incTable.colC) = 0

为了简化,假设整个SELECT Count(*)...语句被伪sql中名为“@subquery”的变量替换,它看起来像

选择*来自myTable,其中0 = @subquery

选择* from myTable,其中@subquery = 0

就像代数一样。您可以翻转“=”运算符一侧的项目而不更改语句的含义。 (如果a = b则b = a) - The Symmetric Propertyof Equality

实际上它正在myTable中搜索记录而不匹配incTable中的记录。

答案 2 :(得分:2)

如果count子查询返回0,我相信where子句将计算为true。

答案 3 :(得分:2)

它只是从myTable中选择了incTable中没有任何相应行(由子查询中where子句中的内容确定)的行,因此where 0 = select count(*) ...。也许如果你扭转它,你对where select count(*) ... = 0更有意义(但基本上顺序并不重要)。

答案 4 :(得分:0)

第二个select语句聚合并计算其结果。 如你所愿,它将返回一个数字。