Count(*)和Count(field_name)在oracle中返回差异输出

rez*_*tin 3 sql oracle

有两个简单的查询(因为它们很简单,我很困惑):

第一个:

select count(*) 
  from (select e.id as employee_id 
          from offic o
          left join employee e
            on o.employee_id = e.id)
 where employee_id is null
Run Code Online (Sandbox Code Playgroud)

第二个:

select count(employee_id) 
  from (select e.id as employee_id 
          from offic o
          left join employee e
            on o.employee_id = e.id)
 where employee_id is null
Run Code Online (Sandbox Code Playgroud)

这两个查询之间的唯一区别是count(employee_id)count(*),其余的完全相同,但它们的结果是不同的.

当存在一些空值时,第二个查询返回零.
有什么不对或其他我不知道的事情?

Lit*_*oot 5

第二个查询计算具有非empty(NOT NULL)EMPLOYEE_ID列值的行.第一个计算所有行,无论是什么行EMPLOYEE_ID.

[编辑:一个简单的例子,显示正在计算的内容]

阅读下面的评论,好吧,其中一些似乎是错误的(或者我误解了作者的意图)所以 - 这里你去(基于11.2.0.4.0).

SQL> select * From a1_test;

      COL1       COL2       COL3
---------- ---------- ----------
         1                     3
         1          2
         1          2          3
                    2          3
                               3

SQL>
SQL> select
  2    count(*) cnt,
  3    count(1) cnt_1,
  4    count(2) cnt_2,
  5    count(3) cnt_3,
  6    --
  7    count(col1) cnt_c1,
  8    count(col2) cnt_c2,
  9    count(col3) cnt_c3
 10  from a1_test;

       CNT      CNT_1      CNT_2      CNT_3     CNT_C1     CNT_C2     CNT_C3
---------- ---------- ---------- ---------- ---------- ---------- ----------
         5          5          5          5          3          3          4
Run Code Online (Sandbox Code Playgroud)

  • @rezaramezanimatin - *几十年前,一些优化器没有很好地开发,当被要求执行`COUNT(*)`或`EXISTS(SELECT*...`查询)时,最终可能会执行数据检索.因此,当时诞生了建议使用"1"(或其他常量)代替.尽管事实上所有主流优化器都知道在这些情况下不进行数据检索,但是有些人仍然会提供这样的建议.(并不是说这是为什么这里是评论者的具体说法)正在说它,为什么你可能会遇到它,特别是对于旧的代码/开发人员) (4认同)
  • @AshokanSivapragasam - 和`count(1)`并不意味着它只看第一列.数字列(表达式)位置仅与`order by`相关.如前所述,计数内部只是一个常数,您可以使用高于选择列表中的项数,字符串或任何其他常量值的数字.除了你没有,并且使用`count(*)`更好/更清楚. (3认同)
  • count(*)和count(1)是相同的.也是相同的,count(2),count('wibble')等. (2认同)