在对有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: