Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 分组,理解有困难_Sql_Ms Access_Select_Group By - Fatal编程技术网

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

我正在查看Access数据库中的一些SQL查询,但我并没有执行这些查询

其中一个SQL查询如下所示:

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的组。