SQL计数(*)和不同

SQL计数(*)和不同,sql,Sql,为什么我们不能在SQL中使用count(distinct*)?就像在计算所有不同的行一样?您确实可以 但是,如果您有一个标识符,则不会有任何完全不同的行。但你可以这样做,例如: SELECT COUNT(DISTINCT SenderID) FROM Messages 您可以选择表中的所有列并按…分组 SELECT column1, column2, column3, count(*) FROM someTable GROUP BY column1, column2, column3 为什么

为什么我们不能在SQL中使用
count(distinct*)
?就像在计算所有不同的行一样?

您确实可以

但是,如果您有一个标识符,则不会有任何完全不同的行。但你可以这样做,例如:

SELECT COUNT(DISTINCT SenderID) FROM Messages

您可以选择表中的所有列并按…分组

SELECT column1, column2, column3, count(*)
FROM someTable
GROUP BY column1, column2, column3
为什么不呢

select 
  count(distinct name)
from 
  people
尽管我强烈建议您重新考虑使用
的任何查询。在大多数情况下,
分组更合适(更快)


编辑:阅读了问题注释后,我应该指出,您应该永远不要要求DBMS做比实际需要做的更多的工作来获得结果。如果您事先知道表中不会有任何重复的行,则不要使用
DISTINCT

UberKludge,并且可能是postgre特定的,但是

select count( distinct table::text ) from table

您可以在SQLServer2005中尝试CTE

;WITH cte AS (
        SELECT  DISTINCT Val1,Val2, Val3
        FROM    @Table
)
SELECT  COUNT(1)
FROM    cte
要回答此问题,请参阅文档

指定所有行都应为 计数以返回的总数 表中的行。COUNT()不接受 参数,不能与一起使用 不同的COUNT()不需要 表达式参数,因为 定义,它不使用 任何特定的信息 专栏。COUNT(*)返回的是 指定表中的行没有 消除重复。这很重要 每一行都是分开的。这包括 包含空值的行

COUNT(*)是与查询匹配的行数

行包含唯一的信息,例如rowid。根据定义,所有行都是不同的


您必须在某些字段中计算值的不同实例。

某些语言可能无法处理“distinct*”,因此,如果您希望通过许多列进行区分,您可能希望使用“distinct ColumnA | ColumnB”,在判断值是否不同之前,将这些值组合在一起。请注意您的变量是否为数字,您的数据库处理程序是否可以对字符串进行自动类型转换。

您所说的“不同行”是什么意思?您是否有在整行中重复的行,这就是您要查找的吗?现在当我想到它时,因为我们的表是标准化的,所以我们不会有完全相同的行,所以它是无用的,对吗??这就是原因吗???@Myth17如果在主键存在的级别上进行规范化,那么在这种情况下,所有行都将是不同的。因为两个poe可能具有相同的名称。OP询问了COUNT(DISTINCT*)。对不起,我回答时,这是问题中的另一个文本。为什么一行包含唯一信息?它不必。。。也许应该这样做,但不是必须的。@CHristian-hi,以前从未见过这样做。出于好奇,我用一个现有的表运行了它,我发现“附近的语法不正确”)。是否在ms sql server中工作?注意-括号内的“我的选择”运行完美Oracle DISTINCT和GROUP BY具有相同的执行计划,因为DISTINCT是使用GROUP BY实现的。所以应该没有区别。@Kamal:对不起,忘记了SQL Server在嵌套查询方面有点不确定。将别名添加到末尾(
as T
)解决了这个问题。@mrshinny:这是关于请求最少的工作量。从概念上讲,
groupby
要求的工作量比
DISTINCT
要少,因此有时(并非总是)会产生更有效的计划。另请参见
JOIN
EXISTS
之间的区别。我只是将MyTable中的select Count(distinct列)用作T,效果很好。这也不是一个完整的证明方法。例如,('test','string')和('tes','t string')看起来是一样的。你可以用填充字符串来做一些事情,但它会变得一团糟。更好的做法是只使用带有DISTINCT的子查询,然后从中获得一个计数。当您说“来自文档”时,会是哪个文档?Sql Server帮助文档。但这实际上并没有得到问题的答案,这并没有回答问题
select count (Tag_no) from tab_raw_tag_value where tag_no in (select distinct tag_no from tab_raw_tag_value)
select count (Tag_no) from tab_raw_tag_value where tag_no in (select distinct tag_no from tab_raw_tag_value)