在对有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
  
  在对有null值的字段进行count时,发现count(1)与count(字段)得到的记录不一样。最后在ITPUB上朋友们的帮助下,解决了。原帖地址:http://www.itpub.net/thread-1383832-1-2.html 结论:1.count(1)与count(*)得到的结果一致,包含null值。      2.count(字段)不计算null
select
  
   count
  
  (*) from table;
其实
  
   count
  
  函数中除了*还可以放其他参数,比如常数、主键id、
  
   字段
  
  ,那么它们有什么区别?各自效率如何?我们应该使用哪种方式来获取表的行数呢?
当搞清楚
  
   count
  
  函数的运行原理后,相信上面几个问题的答案就会了然于胸。
2. 表结构
为了解决上述的问题,我创建了一张 user 表,它有两个
  
   字段
  
  :主键id和name,后者可以为
  
   null
  
  ,建表语句如下。
CREATE TABLE `user` (
 `id` int(11) NOT
  
   NULL
  
  AUTO_I
  
   前一段时间在公司做一个小功能的时候,
   
    统计
   
   一下某种情况下有多少条数据,然后修改的问题,当时感觉很简单,写了一个如下的 SQL:
SELECT
   
    COUNT
   
   (*) FROM t1 where tl.c1 not IN (SELECT t2.c1 FROM t2);
预期的结果是:有多少条数据在 t1 中,同时不在 t2 中,结果为:0,也就是 t1 中数据都在 t2 中,但是很容易就发现某些数据在 t1 中不在 t2 中,所以就感觉很奇怪,这个 SQL 看着也没问题啊。经过一番查询原来是因为 t2 的 c1
   
    字段
   
   包含了
   
    null
   
   
    值
   
   ,修改如下两种形式都可以得到预期的结果:
SELECT COUN
  
  1.
  
   count
  
  (1)与
  
   count
  
  (*)得到的结果一致,包含
  
   null
  
  
   值
  
  。
2.
  
   count
  
  (
  
   字段
  
  )不计算
  
   null
  
  
   值
  
  3.
  
   count
  
  (
  
   null
  
  )结果恒为0
  
   由于Oracle在
   
    count
   
   ()的时候,并不计算
   
    null
   
   (空
   
    值
   
   )部分,所以和空
   
    值
   
   结合起来进行
   
    统计
   
   的时候还是有一些意思。
   
    count
   
   这个函数应用的太频繁,有必要深究一番。      
       测试表格及其数据:
        SQL> desc student;
        Name Type
   
    Null
   
   able Default Comments
  
  
   mysql
   
    count
   
   详解
   
    count
   
   函数是用来
   
    统计
   
   表中或数组中记录的一个函数,下面我来介绍在mysql中
   
    count
   
   函数用法。
   
    count
   
   (*) 它返回检索行的数目, 不论其是否包含
   
    NULL
   
   
    值
   
   。
SELECT 从一个表中检索,而不检索其它的列,并且没有 WHERE子句时,
   
    COUNT
   
   (*)被优化到最快的返回速度。
mysql> SELECT
   
    COUNT
   
   (*) FROM student;
   
    COUNT
   
   (DISTINCT
   
    字段
   
   )这个优化仅适用于 MyISAM表, 原因是这些表类型会储存一个函数返回记录的精确数量,而且非常容易访问。
对于事务型的存储引擎(InnoDB, BDB), 存
  
  
   使用
   
    COUNT
   
   函数处理
   
    NULL
   
   
    值
   
   大部分集合函数在进行计算时都去除
   
    NULL
   
   
    值
   
   ,但
   
    COUNT
   
   函数是一个例外。一般情况下当对一个包含
   
    NULL
   
   
    值
   
   的列使用
   
    COUNT
   
   函数时,这个列中的
   
    NULL
   
   
    值
   
   将会被去除掉。但是如果
   
    COUNT
   
   函数使用一个星号,它就会计算所有的行,而不管其中是否包含
   
    NULL
   
   
    值
   
   。
如果你想使用
   
    COUNT
   
   函数计算包含
   
    NULL
   
   
    值
   
   的列的所有行,那么需要使用IS
   
    NULL
   
   函数(或使用NVL函数)。
  
  
   好多情况下数据库默认
   
    值
   
   都有
   
    null
   
   ,但是经过程序处理很多时候会出现,数据库
   
    值
   
   为空而不是
   
    null
   
   的情况。此时创建唯一索引时要注意了,此时数据库会把空作为多个重复
   
    值
   
   ,而创建索引失败,示例如下:
mysql> select phone ,
   
    count
   
   (1) from User group by phone;
+—————–+———-+
| phone |
   
    count
   
   (1) |
+—————–+———-+
|
   
    NULL
   
   | 70 |
| | 40 |
| +86-13390889711 | 1 |
| +86-13405053385 | 1 |
步骤一中发现数据库中有70条
   
    null
   
   数据,有40
  
  没有和 GROUP BY联合使用。
这样我们一般如果指定了
  
   count
  
  ()的
  
   字段
  
  ,有可能会因为
  
   字段
  
  的数量为
  
   null
  
  出现返回
  
   null
  
  。这样我们使用orm时就会出现一些尴尬的报错。
 目前测试出来的解决方式用*代替
  
   字段
  
  ,这样能返回0.但是影响效率。后面如果研究一下mysql有其他解决方案会更新文章。
第二种是使用group ...
  
   可以使用
   
    COUNT
   
   函数和 IS NOT
   
    NULL
   
   条件来
   
    统计
   
   不为空的
   
    字段
   
   。例如,假设要
   
    统计
   
   一个表中 name
   
    字段
   
   不为空的记录数量,可以使用以下 SQL 语句:
```sql
SELECT
   
    COUNT
   
   (*) FROM table_name WHERE name IS NOT
   
    NULL
   
   ;
这个语句会返回 table_name 表中 name 不为空的记录数。如果要
   
    统计
   
   多个不为空的
   
    字段
   
   ,可以使用 AND 连接多个 IS NOT
   
    NULL
   
   条件。例如,
   
    统计
   
   name 和 age
   
    字段
   
   都不为空的记录数量:
```sql
SELECT
   
    COUNT
   
   (*) FROM table_name WHERE name IS NOT
   
    NULL
   
   AND age IS NOT
   
    NULL
   
   ;
   
    nimeide1234567890:
   
   
   
    百度网盘无法安装/百度云盘无法安装,一闪而过,双击无反应
   
   
    qq_36743799:
   
   
   
    sql中的Update语句为什么不能用表的别名
   
   
    oksice: