¿Qué significa "seleccionar recuento (1) de table_name" en cualquier tabla de base de datos?

91

Cuando lo ejecutamos select count(*) from table_namedevuelve el número de filas.

¿Qué hace count(1)? ¿Qué 1significa aquí? ¿Es lo mismo que count(*)(ya que da el mismo resultado en la ejecución)?

Nrj
fuente
1
Interesante pregunta. También me interesaría saber si la respuesta depende de la implementación (por ejemplo, si el resultado de la consulta es el mismo en SQL Server que en Oracle).
Jon Schneider

Respuestas:

106

El parámetro de la función COUNT es una expresión que se evaluará para cada fila. La función COUNT devuelve el número de filas para las que la expresión se evalúa como un valor no nulo. (* es una expresión especial que no se evalúa, simplemente devuelve el número de filas).

Hay dos modificadores adicionales para la expresión: ALL y DISTINCT. Estos determinan si se descartan los duplicados. Dado que ALL es el valor predeterminado, su ejemplo es el mismo que count (ALL 1), lo que significa que se conservan los duplicados.

Dado que la expresión "1" se evalúa como no nula para cada fila, y dado que no está eliminando duplicados, COUNT (1) siempre debe devolver el mismo número que COUNT (*).

Jeffrey L. Whitledge
fuente
Recuerde seleccionar DISTINCT coloumn1 de table1! = Seleccionar count (DISTINCT coloumn1) de table1;
Kanagavelu Sugumar
También cuente (1) aquí 1 no es una columna no, es una expresión. por ejemplo, seleccione 1 de la tabla1; imprimirá 1 número de veces por el número de filas que tiene la tabla.
Kanagavelu Sugumar
seleccione el recuento (DISTINCT / ALL columnName) de la tabla1; devolverá ninguno de todos / distintos valores NOT NULL de la columna (columnName).
Kanagavelu Sugumar
seleccione DISTINCT column1 de table1; incluirá un valor NULO en la columna (columna1). seleccione el recuento (DISTINCT coloumn1) de la tabla1; no incluirá ni siquiera una fila NULL.
Kanagavelu Sugumar
1
@datps: en realidad, hay un número ilimitado de expresiones que dan el mismo resultado. COUNT ('¡Hola, mundo!') Debería funcionar igual de bien. (No lo he probado). Entonces la pregunta es, ¿por qué crear una expresión especial (*) cuando ya hay un número ilimitado de formas de hacer lo mismo? No puedo hablar por los creadores de SQL (que tienen muchos pecados por los que expiar :)), pero probablemente fue para que la gente no tuviera que elegir arbitrariamente una expresión no nula. Eso habría enturbiado la intención del autor de la consulta. "¿Por qué escribieron 1 en lugar de 2? ¡Esto debe significar algo!"
Jeffrey L Whitledge
26

Aquí hay un enlace que le ayudará a responder sus preguntas. En breve:

count (*) es la forma correcta de escribirlo y count (1) está OPTIMIZADO PARA SER count (*) internamente, ya que

a) contar las filas donde 1 no es nulo es menos eficiente que
b) contar las filas

Eddie Awad
fuente
17

¿Diferencia entre count (*) y count (1) en Oracle?

count (*) significa que contará todos los registros, es decir, todas y cada una de las celdas PERO

count (1) significa que agregará una pseudocolumna con valor 1 y devuelve el recuento de todos los registros


fuente
9

Esto es similar a la diferencia entre

SELECT * FROM table_name and SELECT 1 FROM table_name.  

Si lo haces

SELECT 1 FROM table_name

le dará el número 1 para cada fila de la tabla. Así que sí count(*)y count(1)proporcionará los mismos resultados que will count(8)ocount(column_name)

ChrisHDog
fuente
3
count (column_name) no es exactamente lo mismo, no cuenta filas con nulo en esa columna. Consulte aquí para obtener más detalles: stackoverflow.com/questions/169784
Blorgbeard sale el
Hmm, en realidad eso es para SQL Server. Oracle puede funcionar de manera diferente, supongo.
Blorgbeard sale el
Count nunca debe usar valores NULL según el estándar SQL, ORacle y SQL Server deben tener el mismo comportamiento a este respecto.
Thorsten
"similar a la diferencia entre SELECT * FROM table_name y SELECT 1 FROM table_name". -- realmente no. SELECT * y SELECT 1 son diferentes. SELECT (*) y SELECT (1) dan el mismo resultado.
David Aldridge
6

No hay diferencia.

COUNT(1)básicamente está contando una columna de valor constante 1 para cada fila. Como han dicho otros usuarios aquí, es lo mismo que COUNT(0)o COUNT(42). Cualquier falta de NULLvalor será suficiente.

http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789

El optimizador de Oracle aparentemente solía tener errores, lo que provocó que el recuento se viera afectado por la columna que eligió y si estaba en un índice, por lo que la convención COUNT (1) entró en vigor.

Cade Roux
fuente
5
SELECT COUNT(1) from <table name>

debería hacer exactamente lo mismo que

SELECT COUNT(*)  from <table name>

Puede que haya habido o todavía haya algunas razones por las que funcionaría mejor que SELECT COUNT(*)en alguna base de datos, pero lo consideraría un error en la base de datos.

SELECT COUNT(col_name) from <table name>

sin embargo, tiene un significado diferente, ya que solo cuenta las filas con un valor no nulo para la columna dada.

Thilo
fuente
3

en oráculo creo que estos tienen exactamente el mismo significado

Jarod Elliott
fuente
¿El 1 se refiere a la columna uno?
Dacracot
1
no, 1 se refiere al número constante 1. Cuando dices, ORDEN POR 1, se refiere a la columna uno.
Thilo
eso es lo que me preguntaba hace un tiempo, pero puede especificar cualquier número que sea mayor que el recuento de columnas, pero el resultado es el mismo. Así que definitivamente no es el número de columna.
Nrj
@dacracot: puede que sí, pero no lo creo. Por lo que entiendo, Oracle simplemente reescribe el recuento (1) para que sea recuento (*) en segundo plano
Jarod Elliott
2

Puedes probar así:

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
fuente
0

Dependiendo de a quién le pregunte, algunas personas informan que la ejecución se select count(1) from random_table;ejecuta más rápido que select count(*) from random_table. Otros afirman que son exactamente iguales.

Este enlace afirma que la diferencia de velocidad entre los 2 se debe a un EXPLORACIÓN DE MESA COMPLETA frente a un EXPLORACIÓN COMPLETA RÁPIDA.

Johann Zacharee
fuente
Estás malinterpretando el enlace. LS hace hincapié en que COUNT (COLUMN) puede ser igual y más rápido que COUNT (*), pero solo cuando no hay columnas NOT NULL indexadas, pero COLUMN está indexada y en realidad no tiene valores nulos. Más bien una pregunta con trampa.
David Aldridge
1
Estaba intentando utilizar el enlace para documentar la afirmación de que, en algunas circunstancias, COUNT (1) podría ser más rápido que COUNT (*). Algunas respuestas anteriores habían afirmado que no había diferencias entre los 2, y estaba proporcionando un posible contraejemplo.
Johann Zacharee