在SQL中使用IN和EXISTS之间的区别

时间:2019-07-29    来源:365bet网投娱乐    作者:365bet正网盘口
结论
1
当表B小于表A的数据时,()适合。
2
当表B大于表A的数据时,Exists()是合适的。
如果表A中的数据与表B中的数据大小相同,则效率相似,您可以使用一个。
*从Awhereidin中选择(selectidfromB)
上一个查询只执行一次in和()中的语句,查找表B中的所有标识字段,并缓存它们。
然后检查表A的ID是否等于表B的ID。如果它们相同,则将表A中的记录添加到结果集,直到表A中的所有记录相交。
您的咨询过程类似于以下过程。
ListresultSet =[];数组A =(*从A中选择);数组B =(从B中选择);(inti = 0; iA。
长度i ++){(int j = 0; jB。
长度j ++){if(A[i])
Id == B[j]。
Id){resultSet。
添加(A[i])。返回结果Set; break;}}}返回结果集;
如果表B中的数据很大,您可以看到in()不合适,因为它同时处理表B中的所有数据。
例如,如果表A中有10,000个记录,表B中有1,000,000个记录,则这可能高达10000 * 1000000次,这是非常低效的。
另一个例子:表中有10,000条记录,表B中有100条记录,然后可以进行10000 * 100次。路线数量显着减少,效率显着提高。
结论:当表B小于表A的数据时,in()是合适的。
选择。
* fromAawhereexists(select1fromBbwherea)
Id = b。
ID)
上一个查询使用现有语句,exists()执行A.
持续时间不缓存现有结果集(),因为现有结果集()的内容不重要。重要的是,如果结果集中有记录,则返回true。它返回false。
您的咨询过程类似于以下过程。
ListresultSet =[];数组A =(从A中选择*)(inti = 0; iA)
长度i ++){if(存在(A[i])
Id){//执行select1fromBbwhereb。
Id = a
如果id具有返回结果集的记录
添加(A[i])}}返??回结果集;
如果表B大于表A中的数据,则使用exist()是合适的。它不会经历操作,只需要再次执行查询。
例如,如果表A中有10,000条记录,表B中有1,000,000条记录,则执行10,000次exists()以确定表A的ID是否等于表B的ID。
例如,如果A中的记录数为10,000,B中的记录数为100,000,000,则exists()仅执行A,因此执行10,000次。
时间越长,表B中可以看到的数据越多,它们就越合适。
另一个例子:表中有10,000条记录,表B中有100条记录,而exists()仍然执行10,000次。因为in()在内存中遍历,所以使用()遍历10000 * 100次。()您需要引用数据库。我们知道浏览数据库可以提高性能并使内存更快。
结论:当表B大于表A时,exists()是合适的。
如果表A中的数据与表B中的数据大小相同,则效率相似,您可以使用一个。
例如,Northwind数据库中有一个查询为SELECTc。
CustomerId,CompanyNameFROMCustomerscWHEREEXISTS(SELECTrderIDFROMOrdersoWHEREo)。
CustomerID = c
CustomerID)EXISTS如何运作?
子查询返回OrderId字段,但外部查询正在查找CustomerID和CompanyName字段。这两个字段绝对不在OrderID中。这是什么关系?
EXISTS用于检查子查询是否返回至少一行数据。子查询不返回任何数据,但返回值True或FalseEXISTS指定检测行是否存在的子查询。
语法:parameter EXISTS子查询:子查询是受限制的SELECT语句(不允许使用COMPUTE子句和INTO关键字)。
结果类型:Boolean如果子查询包含行,则返回TRUE。否则返回FLASH。