select * from 表 a where (select count(*) from 表 where no=a.no)>1这是两层查询 select count(*) from 表 where no=a.no 是子查询,为说明方便,该查询叫查询b,而另一层的查询叫查询a处理的步骤可以这样理解. 查询a,扫描表中的第一条记录,此时no,确定. 然后判断条件,即执行子查询b select count(*) from 表 where no=a.no --此时的a.no就等于查询a中的那个no这时就自然可以统计出一个结果来,再判断结果是否>1 如果是,则满足条件,该条记录送入结果集中 如果条件不满足,则该条记录丢弃然后查询a继续扫描下一条记录,重复做上述判断处理,直到扫描完整个表
select count(*) from 表 where no=a.no我就是对这句十分的不解。我的理解是这句的结果是算出a.no=b.no的行数值。而在没有group by语句的情况下用 >1 的 逻辑判断 就能筛选出no 有重复的 数据。这点就十分困惑了。关键是我现在不理解select count(*) from 表 where no=a.no 在这个运行过程中。到底返回出来的是什么样的数据?我以前写的重复数据选择的sql语句一般是这样写的 select no,count(*) from 表 a group by no having count(no)>1 但是这样的语句只能返回 no,数字 的结果 不能返回全部的字段。 邹建 能再在指点一二? 先行拜谢
老大在2楼说的挺明白的了: select count(*) from 表 where no=a.no --此时的a.no就等于查询a中的那个no 这时就自然可以统计出一个结果来,再判断结果是否>1 如果是,则满足条件,该条记录送入结果集中 如果条件不满足,则该条记录丢弃也就是在no不重复时,不输出到结果集,不满足条件,no重复时满足条件,输出到结果集。
count(*)和count(no)的结果是一样的,因为你要对no进行判断,所以不考虑no=null的情况 --不然你理解这句吧,一样效果 select a.* from 表 a join( select no from 表 a group by no having count(no)>1 )b on a.no=b.no
--查询no重复的记录 select * from 表 a where (select count(*) from 表 where no=a.no)>1--查询no不重复的记录 select * from 表 a where (select count(*) from 表 where no=a.no)=1
where (select count(*) from 表 where no=a.no)>1这是两层查询
select count(*) from 表 where no=a.no
是子查询,为说明方便,该查询叫查询b,而另一层的查询叫查询a处理的步骤可以这样理解.
查询a,扫描表中的第一条记录,此时no,确定.
然后判断条件,即执行子查询b
select count(*) from 表 where no=a.no --此时的a.no就等于查询a中的那个no这时就自然可以统计出一个结果来,再判断结果是否>1
如果是,则满足条件,该条记录送入结果集中
如果条件不满足,则该条记录丢弃然后查询a继续扫描下一条记录,重复做上述判断处理,直到扫描完整个表
select no,count(*)
from 表 a
group by no
having count(no)>1 但是这样的语句只能返回
no,数字
的结果
不能返回全部的字段。
邹建 能再在指点一二?
先行拜谢
select count(*) from 表 where no=a.no --此时的a.no就等于查询a中的那个no
这时就自然可以统计出一个结果来,再判断结果是否>1
如果是,则满足条件,该条记录送入结果集中
如果条件不满足,则该条记录丢弃也就是在no不重复时,不输出到结果集,不满足条件,no重复时满足条件,输出到结果集。
--不然你理解这句吧,一样效果
select a.* from 表 a join(
select no from 表 a group by no having count(no)>1
)b on a.no=b.no
select * from 表 a
where (select count(*) from 表 where no=a.no)>1--查询no不重复的记录
select * from 表 a
where (select count(*) from 表 where no=a.no)=1