在任何数据库表上,“select table_name select count(1)”是什么意思?
当我们select count(*) from table_name
执行select count(*) from table_name
它返回行数。
count(1)
做什么? 1
在这里表示什么? 这和count(*)
是一样的(因为它在执行时给出相同的结果)?
COUNT函数的参数是要为每行计算的expression式。 COUNT函数返回expression式求值为非空值的行数。 (*是不被评估的特殊expression式,它只是返回行数。)
expression式还有两个额外的修饰符:ALL和DISTINCT。 这些决定是否丢弃重复。 由于ALL是默认值,因此您的示例与count(ALL 1)相同,这意味着保留了重复项。
由于expression式“1”对每一行都计算为非空值,并且由于不删除重复项,因此COUNT(1)应始终返回与COUNT(*)相同的编号。
这里有一个链接 ,将有助于回答你的问题。 简而言之:
计数(*)是正确的方法来写它和计数(1)是优化内部计数(*) – 自
a)统计1不为空的行效率低于
b)对行进行计数
oracle中count(*)和count(1)之间的区别?
计数(*)意味着它将计数所有logging,即每个单元格但是
count(1)表示将添加一个值为1的伪列,并返回所有logging的计数
这与之间的区别相似
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(1)
基本上只是为每行计算一个常量值为1的列。 正如其他用户所说,这与COUNT(0)
或COUNT(42)
。 任何非NULL
值都足够了。
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Oracle优化器确实使用了错误,导致计数受到您select的列以及是否在索引中的影响,所以COUNT(1)约定应运而生。
在oracle中我相信这些意思完全一样
SELECT COUNT(1) from <table name>
应该做同样的事情
SELECT COUNT(*) from <table name>
在某些数据库中,可能会有或者仍然有一些原因会比SELECT COUNT(*)
执行得更好,但是我会考虑DB中的一个错误。
SELECT COUNT(col_name) from <table name>
但具有不同的含义,因为它仅计算给定列的非空值的行。
你可以这样testing:
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;
根据你问的人,有些人报告说select count(1) from random_table;
执行select count(1) from random_table;
运行速度比select count(*) from random_table
。 其他人声称他们完全一样。
此链接声称2之间的速度差异是由于全表扫描与快速全面扫描。