count(字段)不统计null值

本文解释了在SQL中使用不同的计数函数时的区别,包括count(1)、count(*)、count(字段)和count(null)的具体行为。通过实际示例展示了当字段含有null值时这些函数如何工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在对有null值的字段进行count时,发现count(1)与count(字段)得到的记录不一样。

最后在ITPUB上朋友们的帮助下,解决了。

原帖地址:http://www.itpub.net/thread-1383832-1-2.html

 

结论:1.count(1)与count(*)得到的结果一致,包含null值。
      2.count(字段)不计算null值
      3.count(null)结果恒为0

 

SQL> select * from  v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production

TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

 

 

SQL> desc t_product;
Name         Type         Nullable Default Comments 
------------ ------------ -------- ------- -------- 
PRODUCT_ID   NUMBER(6)    Y                         
PRODUCT_NAME VARCHAR2(50) Y                         
LIST_PRICE   NUMBER(8,2)  Y     

                   

SQL> SELECT *  FROM t_product WHERE list_price IS NULL;

PRODUCT_ID PRODUCT_NAME    LIST_PRICE
---------- --------------- ----------
      3355 HD 8GB /SI      
      1770 8MB Cache /NM  

 

SQL> select count(1), count(*), count(list_price),count(null)
  2    from t_product
  3   where list_price is null;

  COUNT(1)   COUNT(*) COUNT(LIST_PRICE) COUNT(NULL)
---------- ----------    -----------------      -----------
            2             2                            0                   0


<think>嗯,用户的问题集中在SQLCOUNT函数是否统计NULL,这其实是个非常经典的SQL细节问题。从ta引用的三个资料来看,用户可能已经做过一些研究但仍有困惑,特别是对COUNT(*)COUNT(expression)的区别理解够清晰。用户提供的引用[1]其实已经给出关键线索:COUNT(*)COUNT(expression)行为同。但用户似乎更想知道结论而非推导过程。考虑到用户是开发者身份,需要明确可操作的答案,准备在回复中直接分情况说明会更高效。注意到用户提到“包含NULL的记录”,这里存在两个概念:记录本身为NULLvs字段NULL。用户可能混淆了COUNT对整行计数和对特定列计数的差异。需要特别强调COUNT(*)永远统计行数,而COUNT(列名)才会忽略NULL这个重点。引用[2]和[3]给出了CASEWHEN和DISTINCT的用法,虽然直接相关,但说明用户可能有更复杂的统计需求。因此在回答时可适当延伸,给出实际应用的例子,比如用CASEWHEN统计NULL的技巧,这对用户后续工作会有帮助。用户的问题其实触及SQL聚合函数的核心机制。COUNT统计时的NULL处理原则其实也适用于SUM/AVG等函数,这点在回答中应该暗示,方便用户举一反三。另外同数据库系统如Oracle和Access的差异也要提前告知,避免用户踩坑。最后考虑到用户是技术提问,在示例代码中要加入具体的NULL插入和统计操作,让用户能直接验证。特别是用SELECTCOUNT(*)FROMtableWHEREcolumnISNULL这种经典写法,虽然简单但很多初学者会忽略。</think> 在 SQL 中,`COUNT` 函数是否统计包含 `NULL` 的记录取决于其使用方式: ### 1. **`COUNT(*)`:统计所有行(包括包含 `NULL` 的行)** ```sql SELECT COUNT(*) FROM table_name; ``` - **结果**:返回表中**总行数**(包含所有 `NULL` 所在行)。 - **原因**:`COUNT(*)` 统计的是**行数**,与字段是否 `NULL` 无关。 ### 2. **`COUNT(column_name)`:忽略 `NULL` ** ```sql SELECT COUNT(column_name) FROM table_name; ``` - **结果**:返回该列中**非 `NULL` 的数量**(自动忽略所有 `NULL` )。 - **原因**:`COUNT(表达式)` 仅对有效的非 `NULL` 表达式计数。 --- ### 示例验证 假设表 `students` 数据如下: | id | name | |---|--------| | 1 | Alice | | 2 | NULL | | 3 | Bob | - **`COUNT(*)` 结果**: ```sql SELECT COUNT(*) FROM students; -- 返回 3(总行数) ``` - **`COUNT(name)` 结果**: ```sql SELECT COUNT(name) FROM students; -- 返回 2(忽略 name 为 NULL 的行) ``` --- ### 如何统计包含 `NULL` 的记录数? 若需统计字段的 `NULL` 数量,可通过以下方法: 1. **直接统计 `NULL` **: ```sql SELECT COUNT(*) FROM students WHERE name IS NULL; -- 返回 1 ``` 2. **计算**(引用[^1]): ```sql SELECT COUNT(*) - COUNT(name) FROM students; -- 结果 = 总行数 - 非 NULL 行数 = 3 - 2 = 1 ``` 3. **使用 `CASE WHEN` 显式标记(引用[^2])**: ```sql SELECT COUNT(CASE WHEN name IS NULL THEN 1 END) AS null_count FROM students; ``` --- ### 关键结论 | 用法 | 是否统计 `NULL` | 适用场景 | |----------------------|----------------|----------------------------| | `COUNT(*)` | ✅ 是 | 统计表的总行数 | | `COUNT(column_name)` | ❌ 否 | 统计某列非 `NULL` 的数量 | | `COUNT(1)` | ✅ 是 | 等价于 `COUNT(*)`,统计总行数 | > 📌 **注意**:`COUNT(DISTINCT column_name)`(引用[^3])同样会忽略 `NULL` ,仅统计非 `NULL` 唯一。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值