我在学习SQL,很难理解EXISTS语句。我碰到这句话对“存在”和不明白的地方:SQL EXISTS语句如何工作?
使用exists操作,你的子查询可以返回零个,一个或多个行,条件只检查是否子查询返回的任何行。如果您查看子查询的select子句,您将看到它由单个文字(1)组成;由于包含查询中的条件只需要知道返回了多少行,所以子查询返回的实际数据是不相关的。
我不明白的是外部查询如何知道子查询检查哪一行?例如:
SELECT *
FROM suppliers
WHERE EXISTS (select *
from orders
where suppliers.supplier_id = orders.supplier_id);
我明白,如果供应商和订单表匹配ID,子查询将返回true,所有从供应商表中的匹配行的列将被输出。我没有得到的是,如果仅返回true或false,那么子查询如何传达哪个特定的行(可以说供应商ID为25的行)应该被打印。
在我看来,外部查询和子查询之间没有关系。
如果多个子记录与父项相关联,则内部联接将产生与EXISTS不同的结果 - 它们不相同。 – 2011-05-01 06:49:37
我觉得我的混淆可能是我读过子查询与EXISTS返回true或false;但是这不可能是它返回的唯一的东西,对吧?子查询是否也返回所有“在订单表中具有相应行的供应商”?但如果是这样,EXISTS语句如何返回布尔结果?我在课本中读到的所有东西都只是说它只返回一个布尔结果,所以我很难将代码的结果与我被告知返回的结果进行协调。 – Dan 2011-05-01 09:37:13
像函数一样读取EXISTS ... EXISTS(resultset)。如果结果集有行,则EXISTS函数将返回true,如果结果集为空,则返回false。基本上就是这样。 – 2011-05-01 19:49:49