SQL中exists和in比较

in 和exists

in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询。

一直以来认为exists 比in 效率高的说法是不准确的。如果查询的两个表大小相当,那么用in 和exists 差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:

表A(小表),表B(大表)1:

select * from A where cc in (select cc from B)

效率低,用到了A 表上cc 列的索引;

select * from A where exists(select cc from B where cc=A.cc)

效率高,用到了B 表上cc 列的索引。

相反的2:

select * from B where cc in (select cc from A)

效率高,用到了B 表上cc 列的索引;

select * from B where exists(select cc from A where cc=B.cc)

效率低,用到了A 表上cc 列的索引。

not in 和not exists

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;

而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。

时间: 2024-11-03 21:01:21

SQL中exists和in比较的相关文章

sql中exists,not exists的用法

转 sql中exists,not exists的用法 exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:  select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成"select 2 from grade where ...",那么返回

SQL中EXISTS怎么用[转]

SQL中EXISTS怎么用 1 2 3 4 分步阅读 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 方法/步骤 1 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或FalseEXISTS 指定一个子查询,检测 行 的存在. 语法: EXISTS subquery参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字).

sql中exists和notexists用法总结(并和in的比较)

首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如 FOR循环 . 3.Exists执行的流程Exists首先执行外层查询,再执行内存查询,与IN相反. 流程为首先取出外 层中的第 一 元组, 再执行内层查询,将外层表的第一元组代入,若内层查询为真,即有结果 时.返回外层表中的第一元组,接着取出第二元组,执行相同的算法.一直到扫描完外层整表 . ?

SQL中EXISTS使用

EXISTS的作用和IN一样,判断是否包含 建立两张表,第一张T_USER表,如下: 第二张,T_DEP表,表结构如下: 两张表结构,都非常简单,没有添加约束. 此时执行下列SQL: select * from t_user u where exists( select 1 from t_dep d where u.depno = d.id) 得到如下结果: 等同于使用IN: select * from t_user u where u.depno in ( select d.id from t

数据库——SQL中EXISTS怎么用2(转)

数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from areas where id in (select city_id from deals); select * from areas where id in   (select city_id from deals where deals.city_id = areas.id); select *

数据库——SQL中EXISTS怎么用3(转)

有一个查询如下: 1 SELECT c.CustomerId, CompanyName   2 FROM Customers c   3 WHERE EXISTS(   4     SELECT OrderID FROM Orders o   5     WHERE o.CustomerID = cu.CustomerID)   这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在Order

SQL中EXISTS、NOT EXISTS、IN、NOT IN

EXIST和IN 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹

SQL中EXISTS的用法

比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢? EXIS

SQL 中 EXISTS 与 NOT EXISTS

带有 EXISTS 操作符的子查询不返回任何数据,只产生逻辑真值 'true' 或逻辑假值 'false'.带有 EXISTS 操作符的子查询都是相关子查询. 相关子查询:子查询的条件依赖父查询. EXISTS:如果内层查询结果非空,则外层 WHERE 子句返回真值,输出外层查询结果. NOT EXISTS:如果内层查询结果为空,则外层 WHERE 子句返回真值,输出外层查询结果. 样例表 CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, --学号 S

[SQL]SQL中EXISTS的用法

比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢? EXIST