【问题标题】:What does "select count(1) from table_name" on any database tables mean?任何数据库表上的“select count(1) from table_name”是什么意思?
【发布时间】:2016-09-23 23:50:45
【问题描述】:

当我们执行select count(*) from table_name 时,它会返回行数。

count(1) 是做什么的? 1 在这里表示什么?这是否与count(*) 相同(因为它在执行时给出相同的结果)?

【问题讨论】:

  • 有趣的问题。我也对答案是否依赖于实现感兴趣(例如,查询结果在 SQL Server 中是否与在 Oracle 中相同)。

标签: sql database oracle


【解决方案1】:

COUNT 函数的参数是要为每一行计算的表达式。 COUNT 函数返回表达式计算为非空值的行数。 ( * 是一个不计算的特殊表达式,它只是返回行数。)

表达式还有两个额外的修饰符:ALL 和 DISTINCT。这些确定是否丢弃重复项。因为ALL是默认的,所以你的例子和count(ALL 1)一样,就是保留重复的。

由于表达式“1”对于每一行的计算结果都为非空,并且由于您没有删除重复项,因此 COUNT(1) 应始终返回与 COUNT(*) 相同的数字。

【讨论】:

  • 记住 select DISTINCT coloumn1 from table1 != select count(DISTINCT coloumn1) from table1;
  • 这里还有count(1) 1不是coloumn no,它是一个表达式。例如)从 table1 中选择 1;将为该表的行数打印 1 次。
  • 从 table1 中选择 count(DISTINCT/ALL columnName);将返回列 (columnName) 的所有/不同的 NOT NULL 值。
  • 从 table1 中选择 DISTINCT column1;将在列 (column1) 中包含一个 NULL 值。从表 1 中选择计数(DISTINCT coloumn1);甚至不会包含一个 NULL 行。
  • @datps - 实际上有无限数量的表达式可以给出相同的结果。 COUNT('Hello, world!') 应该也能正常工作。 (我还没有尝试过。)所以问题是,当已经有无数种方法可以做同样的事情时,为什么还要创建一个特殊的表达式 (*)?我不能代表 SQL 的创建者(他们有很多罪要赎罪:)),但这可能是因为人们不必随意选择非空表达式。这会混淆查询作者的意图。 “为什么他们写的是 1 而不是 2?这一定意味着什么!”
【解决方案2】:

这里是a link,这将有助于回答您的问题。简而言之:

count(*) 是正确的写法 它和 count(1) 被优化为 count(*) 内部——因为

a) 计算 1 不为空的行数 效率低于
b) 计算行数

【讨论】:

    【解决方案3】:

    oracle中count(*)和count(1)的区别?

    count(*) 表示它将计算所有记录,即每个单元格 但是

    count(1) 表示它将添加一个值为 1 的伪列并返回所有记录的计数

    【讨论】:

      【解决方案4】:

      这和两者的区别类似

      SELECT * FROM table_name and SELECT 1 FROM table_name.  
      

      如果你这样做了

      SELECT 1 FROM table_name
      

      它会给你表格中每一行的数字 1。所以是的,count(*)count(1) 将提供与 count(8)count(column_name) 相同的结果

      【讨论】:

      • count(column_name) 并不完全相同 - 它不计算该列中具有 null 的行。详情见这里:stackoverflow.com/questions/169784
      • 嗯,实际上是针对 SQL Server 的。我想 Oracle 的工作方式可能会有所不同。
      • Count 不应该使用 NULL 值,按照标准 SQL,ORacle 和 SQL Server 在这方面应该具有相同的行为。
      • "类似于 SELECT * FROM table_name 和 SELECT 1 FROM table_name 的区别。" - 并不真地。 SELECT * 和 SELECT 1 是不同的。 SELECT (*) 和 SELECT (1) 给出相同的结果。
      【解决方案5】:

      没有区别。

      COUNT(1) 基本上只是为每行计算一个常量值 1 列。正如这里的其他用户所说,它与COUNT(0)COUNT(42) 相同。任何非NULL 值都足够了。

      http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789

      Oracle 优化器确实曾经明显存在 bug,导致计数受您选择的列以及是否在索引中的影响,因此 COUNT(1) 约定应运而生。

      【讨论】:

        【解决方案6】:
        SELECT COUNT(1) from <table name>
        

        应该和

        做同样的事情
        SELECT COUNT(*)  from <table name>
        

        在某些数据库上它的性能可能优于 SELECT COUNT(*),但我认为这是数据库中的一个错误。

        SELECT COUNT(col_name) from <table name>
        

        但是有不同的含义,因为它只计算给定列的非空值的行。

        【讨论】:

          【解决方案7】:

          在 oracle 中,我相信这些具有完全相同的含义

          【讨论】:

          • 1 是指第一列吗?
          • 不,1指的是常数1。当你说,ORDER BY 1时,它指的是第一列。
          • 这就是我不久前想知道的,但是您可以指定任何大于列数的数字,但结果仍然相同。所以它绝对不是列号。
          • @dacracot:可能但我不这么认为。据我了解,oracle 只是在后台将 count(1) 重写为 count(*)
          【解决方案8】:

          你可以这样测试:

          create table test1(
           id number,
           name varchar2(20)
          );
          
          insert into test1 values (1,'abc');
          insert into test1 values (1,'abc');
          
          select * from test1;
          select count(*) from test1;
          select count(1) from test1;
          select count(ALL 1) from test1;
          select count(DISTINCT 1) from test1;
          

          【讨论】:

            【解决方案9】:

            根据您询问的对象,有些人报告说执行select count(1) from random_table;select count(*) from random_table 运行得更快。其他人声称他们完全一样。

            link 声称两者之间的速度差异是由于 FULL TABLE SCAN 与 FAST FULL SCAN。

            【讨论】:

            • 您误解了链接。 LS 指出 COUNT(COLUMN) 可以与 COUNT(*) 相同并且比 COUNT(*) 更快,但前提是没有索引 NOT NULL 列但 COLUMN 被索引并且实际上没有空值。更多的技巧问题。
            • 我试图使用该链接来记录在某些情况下 COUNT(1) 可能比 COUNT(*) 更快的说法。一些较早的答案表明两者之间没有区别,我提供了一个可能的反例。
            猜你喜欢
            • 2020-08-15
            • 1970-01-01
            • 1970-01-01
            • 2010-12-29
            • 2015-08-07
            • 2021-05-20
            • 1970-01-01
            • 2011-01-17
            • 2020-12-30
            相关资源
            最近更新 更多