O que significa “select count (1) from table_name” em qualquer tabela de banco de dados?

92

Quando o executamos, select count(*) from table_nameele retorna o número de linhas.

O que count(1)fazer? O que 1significa aqui? É o mesmo que count(*)(já que dá o mesmo resultado na execução)?

Nrj
fonte
1
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 (*).

Jeffrey L Whitledge
fonte
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

Eddie Awad
fonte
17

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
9

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)

ChrisHDog
fonte
3
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.

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.

Cade Roux
fonte
5
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.

Thilo
fonte
3

no oracle eu acredito que eles têm exatamente o mesmo significado

Jarod Elliott
fonte
O 1 se refere à coluna um?
dacracot
1
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:

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;
Vikas Kumar
fonte
0

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.

Johann Zacharee
fonte
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.
Johann Zacharee,