Quando o executamos, select count(*) from table_name
ele retorna o número de linhas.
O que count(1)
fazer? O que 1
significa aqui? É o mesmo que count(*)
(já que dá o mesmo resultado na execução)?
Quando o executamos, select count(*) from table_name
ele retorna o número de linhas.
O que count(1)
fazer? O que 1
significa aqui? É o mesmo que count(*)
(já que dá o mesmo resultado na execução)?
Respostas:
O parâmetro para a função COUNT é uma expressão que deve ser avaliada para cada linha. A função COUNT retorna o número de linhas para as quais a expressão é avaliada como um valor não nulo. (* é uma expressão especial que não é avaliada, ela simplesmente retorna o número de linhas.)
Existem dois modificadores adicionais para a expressão: ALL e DISTINCT. Eles determinam se as duplicatas são descartadas. Como ALL é o padrão, seu exemplo é o mesmo que count (ALL 1), o que significa que as duplicatas são mantidas.
Como a expressão "1" é avaliada como não nula para cada linha e como você não está removendo duplicatas, COUNT (1) deve sempre retornar o mesmo número que COUNT (*).
Aqui está um link que ajudará a responder suas perguntas. Em resumo:
count (*) é a maneira correta de escrevê-lo e count (1) é OTIMIZADO PARA SER count (*) internamente - já que
a) contar as linhas onde 1 não é nulo é menos eficiente do que
b) contar as linhas
Diferença entre contagem (*) e contagem (1) no oráculo?
contagem (*) significa que contará todos os registros, ou seja, cada célula, MAS
contagem (1) significa que irá adicionar uma pseudo coluna com valor 1 e retorna a contagem de todos os registros
Isso é semelhante à diferença entre
SELECT * FROM table_name and SELECT 1 FROM table_name.
Se você fizer
SELECT 1 FROM table_name
ele lhe dará o número 1 para cada linha da tabela. Então, sim count(*)
e count(1)
fornecerá os mesmos resultados que irá count(8)
oucount(column_name)
Não há diferença.
COUNT(1)
é basicamente contar uma coluna de valor constante 1 para cada linha. Como outros usuários aqui disseram, é o mesmo que COUNT(0)
ou COUNT(42)
. Qualquer não NULL
valor será suficiente.
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Aparentemente, o otimizador Oracle costumava ter bugs, o que fazia com que a contagem fosse afetada pela coluna escolhida e se ela estava em um índice, então a convenção COUNT (1) surgiu.
SELECT COUNT(1) from <table name>
deve fazer exatamente a mesma coisa que
SELECT COUNT(*) from <table name>
Pode ter havido ou ainda haver alguns motivos pelos quais ele teria um desempenho melhor do que SELECT COUNT(*)
em algum banco de dados, mas eu consideraria isso um bug no banco de dados.
SELECT COUNT(col_name) from <table name>
no entanto, tem um significado diferente, pois conta apenas as linhas com um valor não nulo para a coluna fornecida.
no oracle eu acredito que eles têm exatamente o mesmo significado
Você pode testar assim:
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;
Dependendo de quem você pergunta, algumas pessoas relatam que a execução select count(1) from random_table;
é mais rápida do que select count(*) from random_table
. Outros afirmam que são exatamente iguais.
Este link afirma que a diferença de velocidade entre os 2 é devido a um FULL TABLE SCAN vs FAST FULL SCAN.