Sql 为什么即使我更改函数COUNT()中的参数,结果也总是相同的?

Sql 为什么即使我更改函数COUNT()中的参数,结果也总是相同的?,sql,ms-access,Sql,Ms Access,不管函数COUNT的括号内有什么参数,下面三段代码的结果都是相同的,为什么 SELECT Category.Category, Category.CategoryID, COUNT(Category) AS Popularity FROM FavCategory INNER JOIN Category ON FavCategory.CategoryID= Category.CategoryID GROUP BY Category, Category.CategoryID HAVING COUNT

不管函数COUNT的括号内有什么参数,下面三段代码的结果都是相同的,为什么

SELECT Category.Category, Category.CategoryID, COUNT(Category) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.MemberID)>=2;

SELECT Category.Category, Category.CategoryID, COUNT(FavCategory.CategoryID) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.CategoryID)>=4;

SELECT Category.Category, Category.CategoryID, COUNT(FavCategory.MemberID) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.MemberID)>=2;

SELECT Category.Category, Category.CategoryID, COUNT(FavCategory.MemberID+Category.CategoryID) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.MemberID)>=2;
这是分类表和FAV分类表上的记录

我的猜测是,您实际上在寻找列的不同值,在这种情况下,请使用:

COUNT(DISTINCT (FavCategory.CategoryID))
等等

从中,您尚未指定正在使用的数据库:

COUNTALL表达式为组中的每一行计算表达式并返回非空值的数目

我相信一切都是默认的,而不是截然不同的

假设表中的所有值都不为null,那么仅使用表达式就相当于COUNT*——即,它将返回组的行数。这就是为什么每个表达式都给出相同的结果

如果您没有追求明显的结果,请解释您试图实现的目标,我们可能会建议一种替代方案。嗯,作为SQL初学者,其他人可能可以-我想我不会的。

我猜您实际上是在为列指定不同的值,在这种情况下,请使用:

COUNT(DISTINCT (FavCategory.CategoryID))
等等

从中,您尚未指定正在使用的数据库:

COUNTALL表达式为组中的每一行计算表达式并返回非空值的数目

我相信一切都是默认的,而不是截然不同的

假设表中的所有值都不为null,那么仅使用表达式就相当于COUNT*——即,它将返回组的行数。这就是为什么每个表达式都给出相同的结果


如果您没有追求明显的结果,请解释您试图实现的目标,我们可能会建议一种替代方案。好吧,其他人可能可以-我想我不会,因为我是SQL初学者。

您正在尝试获取Category、Category.CategoryID组合的行数。这意味着DB将创建这2列的所有unq组合,然后打印每个unq组合的行数。若在group子句和where子句中有相同的COL,那个么行数不会改变。有可能会影响行数,但如果没有数据查看,则很难判断其是否有任何影响

您正在尝试获取Category、Category.CategoryID组合的行数。这意味着DB将创建这2列的所有unq组合,然后打印每个unq组合的行数。若在group子句和where子句中有相同的COL,那个么行数不会改变。有可能会影响行数,但如果没有数据查看,很难判断它是否有任何影响

您正在询问原因。它们都是相同的,因为计数取决于字段/表达式是否为null或null。如果该值不为空,则计数;如果为null,则忽略它


表中没有任何空值,因此所有三个查询都报告相同的值。尝试COUNT'DRACULA',COUNT42,COUNT0甚至COUNT-1,它们将为CategoryID 3计数3,为CategoryID 1计数2,它们的工作方式与您的三个查询相同

当然,如果您使用的是内部联接,那么也可以使用COUNT*,事实上确实如此。如果您使用的是左联接,则使用COUNT*是不正确的,必须执行以下操作:COUNTsecondTable.foreignKeyColumnHere;或者,如果Access在Postgresql中支持基于cardinalitylike的计数,只需执行以下操作:COUNTsecondTable*

有关计数的入门知识和正确使用plug alert的启示,请阅读我在

@伊丹

鉴于这些数据:

create table Person
(
  PersonId int not null primary key, 
  Name varchar(100) not null, 
  Middlename varchar(100) null
);

insert into Person(PersonId,Name,MiddleName) values
(1,'John','Winston'),
(2,'Paul','James'),
(3,'George',NULL),
(4,'Ringo','Parkin');
所有这些都将返回4:

select count(PersonID) from Person;

select count(Name) from Person;

select count(*) from Person;

select count(1) from Person;

select count(0) from Person;

select count(2) from Person;

select count(-1) from Person;

select count(42) from Person;

select count('Dracula') from Person;
除以下内容外,返回3:

select count(MiddleName) from Person;

现场测试:

您正在询问原因。它们都是相同的,因为计数取决于字段/表达式是否为null或null。如果该值不为空,则计数;如果为null,则忽略它


表中没有任何空值,因此所有三个查询都报告相同的值。尝试COUNT'DRACULA',COUNT42,COUNT0甚至COUNT-1,它们将为CategoryID 3计数3,为CategoryID 1计数2,它们的工作方式与您的三个查询相同

当然,如果您使用的是内部联接,那么也可以使用COUNT*,事实上确实如此。如果您使用的是左联接,则使用COUNT*是不正确的,必须执行以下操作:COUNTsecondTable.foreignKeyColumnHere;或者,如果Access在Postgresql中支持基于cardinalitylike的计数,只需执行以下操作:COUNTsecondTable*

有关计数的入门知识和正确使用plug alert的启示,请阅读我在

@伊丹

鉴于这些数据:

create table Person
(
  PersonId int not null primary key, 
  Name varchar(100) not null, 
  Middlename varchar(100) null
);

insert into Person(PersonId,Name,MiddleName) values
(1,'John','Winston'),
(2,'Paul','James'),
(3,'George',NULL),
(4,'Ringo','Parkin');
所有这些都将返回4:

select count(PersonID) from Person;

select count(Name) from Person;

select count(*) from Person;

select count(1) from Person;

select count(0) from Person;

select count(2) from Person;

select count(-1) from Person;

select count(42) from Person;

select count('Dracula') from Person;
除以下内容外,返回3:

select count(MiddleName) from Person;

现场测试:

如果您希望在结果中更容易看到受欢迎程度,您可能应该添加一个ORDER BY子句,以按计数c对结果进行排序 专栏:


还请注意,在这种情况下,在上面的示例中,对联接表的FavCategory列MemberID之一的值进行计数是至关重要的。如果某些类别在FavCategories中没有匹配项,MemberID将为NULL,因此不会按计数计数。

如果您希望在结果中更容易看到流行程度,您可能应该添加ORDER by子句以按计数列对结果进行排序:

SELECT
  Category.Category,
  Category.CategoryID,
  COUNT(FavCategory.MemberID) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.MemberID)>=2
ORDER BY Popularity DESC;

还请注意,在这种情况下,在上面的示例中,对联接表的FavCategory列MemberID之一的值进行计数是至关重要的。如果某些类别在FavCategories中没有匹配项,MemberID将为NULL,因此不按计数计数。

好的,我使用的是MS Access,它不支持您提到的语法,例如COUNTDINSTINCT参数。我想知道的是每个电影类别的受欢迎程度。@JDein:那么我就用COUNT*-你只想知道每个组中的行数,对吗?我用的是MS Access,它不支持你提到的语法,比如COUNTDINSTINCT参数。我想知道的是每一类电影的受欢迎程度。@JDein:那么我用COUNT*-你只想知道每组电影的行数,对吗?您第一次查询的类别1和3的计数结果是什么?类别3的计数结果是什么?类别1的计数结果是什么?类别1的计数结果是什么?类别3的计数结果是什么?类别1的计数结果是什么?我是新手。你能解释一下COUNT'DRACULA',COUNT42,COUNT0,COUNT1和COUNT-1是什么意思吗?@JDein这是一种开玩笑的说法,表示任何要计算的参数,只要参数不为null,就被计算为1:-这就是为什么你所有关于问题的查询都返回相同的COUNT我是新手。你能解释一下COUNT'DRACULA',COUNT42,COUNT0,COUNT1和COUNT-1是什么意思吗?@JDein这是一种开玩笑的说法,表示任何要计算的参数,只要参数不为null,就被计算为1:-这就是为什么你所有关于问题的查询都返回相同的计数