Pergunta interessante. Também estou interessado em saber se a resposta depende da implementação (por exemplo, se o resultado da consulta é o mesmo no SQL Server e no Oracle).
Jon Schneider,
Respostas:
106
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 (*).
Lembre-se de selecionar DISTINCT coloumn1 da tabela1! = Selecionar contagem (DISTINCT coloumn1) da tabela1;
Kanagavelu Sugumar
Também conte (1) aqui 1 não é a coluna não, é uma expressão. por exemplo) selecione 1 da tabela 1; irá imprimir 1 número de vezes para número de linhas que a tabela possui.
Kanagavelu Sugumar
selecione a contagem (DISTINCT / ALL columnName) da tabela1; não retornará nenhum de todos os valores NOT NULL / distintos da coluna (columnName).
Kanagavelu Sugumar
selecione DISTINCT coluna1 da tabela1; incluirá um valor NULL na coluna (coluna1). selecione a contagem (DISTINCT coloumn1) da tabela1; não incluirá nem mesmo uma linha NULL.
Kanagavelu Sugumar
1
@datps - Na verdade, há um número ilimitado de expressões que fornecem o mesmo resultado. COUNT ('Olá, mundo!') Também deve funcionar. (Eu não tentei) Portanto, a questão é: por que criar uma expressão especial (*) quando já existe um número ilimitado de maneiras de fazer a mesma coisa? Não posso falar pelos criadores do SQL (que têm muitos pecados para expiar :)), mas provavelmente foi para que as pessoas não tivessem que escolher arbitrariamente uma expressão não nula. Isso teria confundido a intenção do autor da consulta. "Por que eles escreveram 1 em vez de 2? Isso deve significar alguma coisa!"
Jeffrey L Whitledge
26
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
count (column_name) não é exatamente o mesmo - ele não conta linhas com null nessa coluna. Veja aqui para detalhes: stackoverflow.com/questions/169784
Blorgbeard foi lançado em
Hmm, na verdade isso é para o SQL Server. O Oracle pode funcionar de forma diferente, suponho.
Blorgbeard será lançado em
A contagem nunca deve usar valores NULL de acordo com o SQL padrão, o ORacle e o SQL Server devem ter o mesmo comportamento a esse respeito.
Thorsten,
"semelhante à diferença entre SELECT * FROM nome_tabela e SELECT 1 FROM nome_tabela." -- Na verdade não. SELECT * e SELECT 1 são diferentes. SELECT (*) e SELECT (1) fornecem o mesmo resultado.
David Aldridge,
7
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 NULLvalor será suficiente.
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.
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.
não, 1 se refere ao número constante 1. Quando você diz ORDER BY 1, ele se refere à coluna um.
Thilo,
isso é o que eu me perguntei há algum tempo, mas você pode especificar qualquer número que seja maior do que a contagem da coluna, mas o resultado é o mesmo. Portanto, definitivamente não é o número da coluna.
Nrj
@dacracot: pode, mas não acredito. Pelo que entendi, o oracle apenas reescreve a contagem (1) para ser a contagem (*) em segundo plano
Jarod Elliott
2
Você pode testar assim:
createtable test1(
id number,
name varchar2(20));insertinto test1 values(1,'abc');insertinto test1 values(1,'abc');select*from test1;select count(*)from test1;select count(1)from test1;select count(ALL1)from test1;select count(DISTINCT1)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.
Você está interpretando mal o link. LS está enfatizando que COUNT (COLUMN) pode ser igual e mais rápido que COUNT (*), mas apenas quando nenhuma coluna NOT NULL está indexada, mas COLUMN está indexada e, na verdade, não tem valores nulos. Mais uma pergunta capciosa.
David Aldridge,
1
Eu estava tentando usar o link para documentar a alegação de que, em algumas circunstâncias, COUNT (1) poderia ser mais rápido do que COUNT (*). Algumas respostas anteriores afirmavam que não havia diferenças entre os 2, e eu estava fornecendo um possível contra-exemplo.
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 (*).
fonte
Aqui está um link que ajudará a responder suas perguntas. Em resumo:
fonte
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
fonte
Isso é semelhante à diferença entre
Se você fizer
ele lhe dará o número 1 para cada linha da tabela. Então, sim
count(*)
ecount(1)
fornecerá os mesmos resultados que irácount(8)
oucount(column_name)
fonte
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 queCOUNT(0)
ouCOUNT(42)
. Qualquer nãoNULL
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.
fonte
deve fazer exatamente a mesma coisa que
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.no entanto, tem um significado diferente, pois conta apenas as linhas com um valor não nulo para a coluna fornecida.
fonte
no oracle eu acredito que eles têm exatamente o mesmo significado
fonte
Você pode testar assim:
fonte
Dependendo de quem você pergunta, algumas pessoas relatam que a execução
select count(1) from random_table;
é mais rápida do queselect 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.
fonte