告诉我sql1和sql2之间的区别:
sql1:
select count(1)
from table_1 a
inner join table_2 b on a.key = b.key where a.id in (
select id from table_1 group by id having count(1) > 1
)
sql2:
select sum(a) from (
select count(1) as a
from table_1 a
inner join table_2 b on a.key = b.key group by a.id having count(1) > 1
)
为什么输出不一样?
2条答案
按热度按时间guykilcj1#
这些查询甚至不相似。他们很不一样。让我们检查一下第一个:
首先进行内部联接:
在本例中,可以使用count(1)、count(id)、count(*),这是等效的。您正在计算这两个表中的公共元素:那些具有相同键字段的元素。
在此之后,您将执行以下操作:
换句话说,表1的每个“id”在表1中必须至少有两次。
最后,你要做的是:
换句话说,计算这些元素。所以,翻译成英语你已经做到了:
获取表1的每条记录,并与表2的记录配对以获得id,并且只获取那些匹配的记录
对于上面的结果,只过滤出表1的id多次出现的元素
数一数结果
让我们看看第二个查询会发生什么:
您正在进行相同的内部联接:
但是,您是按表的id对其进行分组:
然后只过滤出出现多次的元素:
到目前为止,结果是一组记录,它们在两个表中都有共同的键字段,但按id分组:这意味着只有那些在表\u b中至少有两次的字段才会输出此联接。然后,按id分组,将这些结果折叠到table1.id字段中并计算结果。我想很少有记录能符合这个严格的标准。
最后,把所有这些集合相加。
lx0bsm1f2#
当您使用count(*)时,您将对所有行进行计数。sum()函数是一个聚合函数,返回一组值中所有或不同值的总和。