标题:mysql 学习第10天 exist用户和where in的区别

-------------------------------------------------------------------------------------------------------------------------------

时间:2012/4/26 18:08:17

-------------------------------------------------------------------------------------------------------------------------------

内容:

有一个表1 叫TA 记录汶川地震时候捐款信息放着捐款人民和金额和名字

 name  donate

 stephen

 100
 hou  200
 zhang  200
 zheng  200
xiao  200

有一个表2 叫TB 记录玉树地震时候捐款信息放着捐款人民和金额和名字

 name  donate

 xiao

 100
 hou  200
 zhu  200
 ben  200
wu  200

现在我需要知道在玉树地震捐款的名单中 谁在汶川地址的时候已经捐过了

可以用where in来做

select * from TB where name in (select name from TA),

where in执行方法是先做内查询的  得到零时表的结果集

然后对tb表中每一户数据进行判断 是否在这个结果集中

那么计算方法是加入a表有a行 b表有b行 计算量是

1,取出经过筛选的a行数据----2,对b行的每一行数据在a行数据中对比 找到就复合条件 比较A*B次  就得到结果

总的计算量是  读取(A)次+比较(A*B)次

也可以用 exists 做

select * from TB where exists (select 1 from TA TB.name=TA.name)

exists执行方法是 取出外表的每行数据 代入到 内部中进行比较, 如果存在 就得到结算

那么我门来算下这种方法的计算量

读取B行+ 比较(A*B)次

那么很明显 如果a比较小的时候 用in 也就是说先计算的表比较小时候用in

如果b小的时候用exists  也是读取小表用

 

那么简单了 什么时候用exists 什么使用用in呢

 

当我手上拿着一张小表 我要去大表里找小表中重复的数据我用exsit

如果手上是大表 我要小表中找重复的数据我用in

 

 

有一个表1 叫TA 记录汶川地震时候捐款信息放着捐款人民和金额和名字

 name  donate

 stephen

 100
 hou  200
 zhang  200
 zheng  200
xiao  200

有一个表2 叫TB 记录玉树地震时候捐款信息放着捐款人民和金额和名字

 name  donate

 xiao

 100
 hou  200
 zhu  200
 ben  200
wu  200

现在我需要知道在玉树地震捐款的名单中 谁在汶川地址的时候已经捐过了

可以用where in来做

select * from TB where name in (select name from TA),

where in执行方法是先做内查询的  得到零时表的结果集

然后对tb表中每一户数据进行判断 是否在这个结果集中

那么计算方法是加入a表有a行 b表有b行 计算量是

1,取出经过筛选的a行数据----2,对b行的每一行数据在a行数据中对比 找到就复合条件 比较A*B次  就得到结果

总的计算量是  读取(A)次+比较(A*B)次

也可以用 exists 做

select * from TB where exists (select 1 from TA TB.name=TA.name)

exists执行方法是 取出外表的每行数据 代入到 内部中进行比较, 如果存在 就得到结算

那么我门来算下这种方法的计算量

读取B行+ 比较(A*B)次

那么很明显 如果a比较小的时候 用in 也就是说先计算的表比较小时候用in

如果b小的时候用exists  也是读取小表用

 

那么简单了 什么时候用exists 什么使用用in呢

 

当我手上拿着一张小表 我要去大表里找小表中重复的数据我用exsit

如果手上是大表 我要小表中找重复的数据我用in