Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 任何数据库表上的“从表名称中选择计数(1)”是什么意思?_Sql_Database_Oracle - Fatal编程技术网

Sql 任何数据库表上的“从表名称中选择计数(1)”是什么意思?

Sql 任何数据库表上的“从表名称中选择计数(1)”是什么意思?,sql,database,oracle,Sql,Database,Oracle,当我们从表_name执行select count*时,它返回行数 count1做什么?1在这里意味着什么?这与count*相同吗?因为它在执行时会给出相同的结果?在oracle中,我相信它们具有完全相同的含义这类似于 SELECT * FROM table_name and SELECT 1 FROM table_name. 如果你这样做 SELECT 1 FROM table_name 它将为表中的每一行提供数字1。因此,yes count*和count1将提供与count8或coun

当我们从表_name执行select count*时,它返回行数


count1做什么?1在这里意味着什么?这与count*相同吗?因为它在执行时会给出相同的结果?

在oracle中,我相信它们具有完全相同的含义

这类似于

SELECT * FROM table_name and SELECT 1 FROM table_name.  
如果你这样做

SELECT 1 FROM table_name

它将为表中的每一行提供数字1。因此,yes count*和count1将提供与count8或countcolumn_name相同的结果,没有区别

COUNT1基本上只是为每行计算一列的常量值。正如这里的其他用户所说,它与COUNT0或COUNT42相同。任何非空值都足够了


Oracle optimizer显然使用了一些bug,这导致计数受您选择的列以及它是否在索引中的影响,因此COUNT1约定应运而生。

count函数的参数是一个要为每行计算的表达式。COUNT函数返回表达式计算为非空值的行数。*是一个不计算的特殊表达式,它只返回行数

表达式还有两个附加修饰符:ALL和DISTINCT。这些参数确定是否丢弃重复项。由于ALL是默认值,因此您的示例与countALL 1相同,这意味着保留重复项

由于表达式1对每一行的计算结果均为非null,并且您没有删除重复项,因此COUNT1应始终返回与COUNT*相同的数字

SELECT COUNT(1) from <table name>
但是,它有不同的含义,因为它只计算给定列中具有非空值的行。

这有助于回答您的问题。简言之:

count*是正确的书写方式 它和count1被优化为 内部计数*自

对1不为空的行进行计数 效率不如 b数一数行


根据你问的人,有些人报告说,从随机_表中执行select count1;运行速度比从随机_表中选择计数*快。其他人则声称他们完全一样


这表明2之间的速度差异是由于全表扫描与快速全表扫描造成的。

oracle中count*和count1之间的差异

count*表示它将统计所有记录,即每个单元格 但是


count1表示它将添加一个值为1的伪列,并返回所有记录的计数

您可以这样测试:

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;

1是指第一列吗?不是,1是指常数1。当你说ORDER BY 1时,它指的是第1列。这是我刚才想知道的,但是你可以指定任何大于列计数的数字,结果仍然是一样的。所以它肯定不是列号。@dacracot:可能是,但我不这么认为。据我所知,oracle只是在背景有趣的问题中将count1改写为count*。我还想知道答案是否取决于实现,例如,SQL Server中的查询结果是否与Oracle中的相同。countcolumn\u名称不完全相同-它不计算该列中包含null的行。请参见此处了解详细信息:嗯,实际上这是针对SQL Server的。Oracle可能会有不同的工作方式。根据标准SQL,Count不应使用空值,Oracle和SQL Server在这方面应具有相同的行为。类似于从表_名称中选择*和从表_名称中选择1之间的区别。-不是真的。选择*和选择1是不同的。选择*和选择1给出相同的结果。您误解了链接。LS指出,COUNTCOLUMN可以与COUNT*相同,也可以比COUNT*快,但只有在索引了非空列,但索引了列并且实际上没有空值的情况下。更多的是一个骗人的问题。我试图用这个链接来证明这样的说法,在某些情况下,COUNT1可能比COUNT*快。之前的一些回答表明2之间没有差异,我提供了一个可能的反例。还记得从表1中选择不同的Column1吗!=从表1中选择countDISTINCT Column1;这里的count1不是冒号,它是一个表达式。e、 g从表1中选择1;将为表中的行数打印1次。从表1中选择countDISTINCT/ALL columnName;将返回columnName列的所有/不同的非空值。从表1中选择不同的column1;将在列1中包含一个空值。从表1中选择countDISTINCT Column1;甚至不包括一个空行。@datps-实际上有无限多个表达式给出相同的结果。伯爵“你好,世界!”应该也行。我还没试过。所以问题是,既然已经有无数种方法可以做同样的事情,为什么还要创建一个特殊的表达式?我说不出话来 对于SQL的创建者来说,他们有许多罪需要弥补:,但这可能是为了避免人们随意选择非空表达式。这可能会混淆查询作者的意图。为什么他们写的是1而不是2?这一定有什么意义!
SELECT COUNT(col_name) from <table name>
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;