Sql 分组,理解有困难
我正在查看Access数据库中的一些SQL查询,但我并没有执行这些查询 其中一个SQL查询如下所示:Sql 分组,理解有困难,sql,ms-access,select,group-by,Sql,Ms Access,Select,Group By,我正在查看Access数据库中的一些SQL查询,但我并没有执行这些查询 其中一个SQL查询如下所示: select column1 from table1 group by column1 having count(*)>1 此查询的目的是在column1中查找多次出现的值。我可以验证此查询是否正常工作,并返回多次出现的列值 然而,我不明白为什么这个查询有效。根据我的理解,使用group by将删除重复的字段。例如,如果第1列有 column1 apple man
select column1 from table1 group by column1 having count(*)>1
此查询的目的是在column1
中查找多次出现的值。我可以验证此查询是否正常工作,并返回多次出现的列值
然而,我不明白为什么这个查询有效。根据我的理解,使用group by
将删除重复的字段。例如,如果第1列有
column1
apple
mango
mango
执行分组方式(第1列)
将导致
column1
apple
mango
此时,如果执行having count(*)>1
或having count(column1)>1
,则不会返回任何结果,因为group by已删除重复字段。但很明显,我错了,因为上面的SQL语句确实给出了准确的结果
你能让我知道我理解的问题吗
编辑1:
除了公认的答案之外,我在一篇关于SQL操作顺序的文章中真正帮助我理解了GROUPBY不仅仅是删除重复值,它还为GROUPBY子句的每个不同值返回一行,并允许您为每个这样的唯一值应用聚合函数
在这个查询中,您实际上查询了
column1
的值以及count(*)的结果每个column1的值,然后使用having
子句只返回column1
中具有count(*)的值
大于1。GROUP BY子句根据您提到的字段对选择进行分组,在本例中为第1列,但可以是组合列(例如第1列、第2列)。
顺便说一下,我想如果你跑步:
SELECT column1, Count(*) AS [Count], MIN(column2) AS MinColumn2, MAX(column2) AS MaxColumn2
FROM table1
GROUP BY column1;
将帮助您了解分组是如何工作的。当直接按任何列进行筛选时,您可以使用WHERE条件,但如果要按分组计算的任何字段进行筛选,则需要使用HAVING子句。您误解了HAVING
的工作原理。事实上,您可以通过使用子查询来考虑它。您的查询相当于:
select column1
from (select column1, count(*) as cnt
from table1
group by column1
) as t
having cnt > 1;
也就是说,have
在聚合发生后过滤聚合查询。但是,聚合函数是按组应用的。因此,count(*)
正在计算每组中的行数。这就是它标识重复项的原因。Having子句适用于分组后形成的行组。分组结果为苹果和芒果两组。在这些组中的每个组上,我们都运行having子句。苹果组有1排,芒果组有2排。这就是它的工作原理拥有条件将导致仅返回Mango行,因为它是唯一一个计数大于1的组。