首先说一句,大神就不用看了。
先看一个sql语句
select distinct name from user u1 where (select count(*) from user u2 where u1.name=u2.name)>3
这句话是选出user表中name字段相同的名字出现三次以上的name。
这句话的语义到底应该怎么分析呢?
在SQL语句中,where表示条件,如果这一行满足where之后的条件,就是说,将这一行代入where之后的表达式,如果返回true,那么就选择这一行,如果返回false,就丢弃这一行。
那么这句话的语义也就比较好理解了,就是,将user表中的行分别代入where后面的表达式,也就是后面的子查询,如果后面的子查询查询结果大于3,那么就保留这一行,如果不大于3,就丢弃这一行。而where子句中子查询选出来的就是name在这张表中的出现次数。
但是这种查询在MYSQL中效率是非常低的,explain他可以看到第二行是DEPENDENT SUBQUERY,也就是说,子查询依赖于第一行的查询结果,这个查询是分两步走的,
第一步:查询出所有user中的行,
第二步:将每一行中的在子查询中使用的字段代入子查询,将子查询的结果代入,以决定是否需要保留这一行
这样效率绝对上不去了!
关于where子句中的子查询语法说明,布布扣,bubuko.com
原文:http://blog.csdn.net/whodarewin2005/article/details/19922859